Mysql dbに裏打ちされたSpringsでHibernateを使用しています。
これは、私がエントリを作成するために使用するものに似たエンティティです
@Entity
@Table(name = "my_table") {
@Basic
@Column(name = "my_string", nullable = false)
private String myString;
}
SQL定義は
CREATE TABLE `my_table` (
`my_string` varchar(200) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
テーブルはnull値を許可しますが、列myStringは、JPAアノテーションに従ってnull可能ではありません。これにより、予測できない動作が発生します。
Q:挿入中にエンティティレベルでnull不可を常に適用していますか?それとも無視される場合があります
私の期待は、すべてのエントリーが拒否されるべきだったということでした。しかし、この設定では、多くのエントリ(> 7000)がテーブルに入りました。春からDataIntegrityViolation例外が発生することがある
org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: ...; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: ....
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.Java:652)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.Java:104)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.Java:403)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.Java:58)
....
....
Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: ....
at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.Java:103)
....
エンティティとテーブルに別々の署名を付けることは悪い習慣であることを理解していますが、この動作の原因と、それが原因で省略された可能性のあるその他の抜け穴を特定しようとしています。
Versions -
Mysql- 5.5
Hibernate - 4.0.0
Hibernate-jpa - 2.0
Spring-core- 3.1.0
Spring-jdbc- 3.1.2
@ Column(nullable)アノテーションと@NotNullアノテーション はよく混同されます。
@Column(nullable)
は、生成されたDDLスクリプト用です。しかし、Hibernateを使用してDDLを生成しないので、DDLにまったく依存しないでください。あなたが欲しいのは@NotNull
はランタイム検証トリガーです。
Hibernate Validatorアノテーション(またはJPA 2.0アノテーション)を定義する場合 これらのDDLも取得できます :
初期状態では、Hibernate(バージョン3.5.x以降)はエンティティに対して定義した制約をマッピングメタデータに変換します。たとえば、エンティティのプロパティに@NotNullアノテーションが付けられている場合、その列はHibernateによって生成されたDDLスキーマでnullでないと宣言されます。
HibernateでJPAを使用している場合は、検証を必ず有効にしてください。
JPA 2を使用していて、Hibernate Validatorがクラスパスにある場合、JPA2仕様ではBean Validationを有効にする必要があります。セクション10.1.2「Hibernateイベントベースこの場合、validationはpersistence.xmlで設定できます。 persistence.xmlは、AUTO、CALLBACK、NONEに設定できるノード検証モードも定義します。デフォルトはAUTOです。