JPAで列の長さを正確に設定するとどうなりますか?
@Column(name = "middle_name", nullable = false, length = 32)
public String getMiddleName() {
return this.middleName;
}
アノテーションを使用してエンティティオブジェクトに基づいてデータベーススキーマ(DDL)を生成できることを理解していますが、永続化が発生した場合、長さは何らかの種類のチェックまたは切り捨てを行いますか、それともスキーマ作成のみに使用されますか?
また、JPAはさまざまな実装の上に置くことができることを認識しています。この場合に関心のある実装はHibernateです。
永続化が発生した場合、長さは何らかの種類のチェックや切り捨てを行いますか、それともスキーマ作成のみに使用されますか?
length
アノテーションの Column
属性を使用して、以下を指定します。
列の長さ。 (文字列値の列が使用される場合にのみ適用されます。)
また、生成されたDDLでのみ使用されます。この例では、結果の列はVARCHAR(32)
として生成され、より長い文字列を挿入しようとするとSQLエラーが発生します。
検証のために、Bean Validation APIから@Size(max=32)
constraint を追加できます(- JSR 3 )。実行可能なテストでサンプルを提供しました here 。
Size
とlength
の両方を提供することは冗長に思えるかもしれませんが、Bean Validation仕様の Appendix D。 によれば、Bean Validation対応DDLの生成は永続性プロバイダーには必須ではありません。したがって、DDLにはlength
を使用し、@Size
検証用。
興味がある場合は、JPA 2.0を使用してクラスパスにBean Validation実装を配置してください。 JPA 1.0では、これを参照してください 前の回答 。
ところで、長さを設定しないと、デフォルトで255になります(MySQLでテスト済み)
@column(length = 32)はDDLの目的のみであり、制限するためではなく、テーブルレベルで制限されていない限り、32文字以上を許可します。サイズを制限するには、@ size(max = 32)を使用します。
Hibernate 4.3.11(および他のバージョン)は、検証アノテーションに注意を払う必要があります。 -アップグレードする必要があるかもしれません
これは Hibernate 4.3.11マニュアル からの引用です
Hibernate Coreは、いくつかの外部モジュール/プロジェクトとの統合も提供します。これには、Bean Validation(JSR 303)およびHibernate Searchのリファレンス実装であるHibernate Validatorが含まれます。
... HibernateとBean Validationの統合は2つのレベルで機能します。まず、クラスのメモリ内インスタンスに制約違反がないかチェックできます。次に、Hibernateメタモデルに制約を適用し、生成されたデータベーススキーマにそれらを組み込むことができます。 ...
HibernateはBean Validation制約を使用して、正確なデータベーススキーマを生成します。
@NotNull leads to a not null column (unless it conflicts with components or table inheritance) @Size.max leads to a varchar(max) definition for Strings @Min, @Max lead to column checks (like value <= max) @Digits leads to the definition of precision and scale (ever wondered which is which? It's easy now with @Digits :) )
注:@Lenghも@Sizeのように機能します
Hibernate Validator 5.1を使用する場合は、el-Implementationも必要です。例えば
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>el-impl</artifactId>
<version>2.2</version>
</dependency>
これがない場合、Hibernate ORMはHibernate Validationを開始できません。したがって、たとえば@Length
、@Size
アカウントで!