現在、いくつかの既存のコードを Hibernate 3.2 から Hibernate 3.6.10.Final に移行しています (ちなみに、Spring 2.0 から Spring 3.1.2 にも移行しています)。
H2 データベースに対して実行されているいくつかの統合テストに問題があり、一部のフィールドが null 可能でないことを確認しています。- nullable=false とマークされたフィールドに null 文字列を挿入しようとすると、例外で終了することをテストします - スキーマが正しく作成されていることを確認しました: 列は null 可能ではありません。
- H2 (MySQL モード) を使用すると、null 許容制約は無視されます。空の文字列がデータベースに挿入されます。
- MySQL データベースに対してテストを実行した場合、このケースは再現しません。
- 以前は Hibernate 3.2 で動作していました
たとえば、クラス Person がある場合:
@Entity
class Person {
@Id
@GeneratedValue
private Long id;
@Column(nullable=false)
private String name;
//getters and setters
}
そして、テストがあります(まだJUnit3を使用しています。後で移行します):
@ExpectedException(value=DataIntegrityViolationException.class)
public void testPerson_NameCantBeNull() throws Exception {
// Given
Person person = new Person();
person.setName(null);
// When
getHibernateTemplate().persist(person);
//Flush and clear session
}
nullable=false を@NotNull
注釈で置き換えることでこれを修正できますが、同じ例外が発生するとは思わないため、巨大なコード ベースで置き換えたくありません。Hibernate で H2Dialect クラスと JIRA の問題を簡単に調べましたが、何も見つかりませんでした。
誰がそれがどこから来たのか知っていますか?
編集:いくつかの追加情報、Hibernate ログに TRACE レベルを追加しました。
null を挿入し、フィールドが でマークされて
@Column(nullable=false)
いる場合、次のログがあります: 2013-01-16 15:57:52 TRACE [BasicExtractor] found [] as column [NAME1_3_]null を挿入し、フィールドがでマークされていない場合
@Column(nullable=false)
、次のログがあります: 2013-01-16 15:57:52 TRACE [BasicExtractor] found [null] as column [NAME1_3_]
編集 (22/01/13) :
問題の正確な原因はまだわかりませんでしたが、H2 を使用した MySQL モードに関連付けられていることがわかりました。MySQL モードを無効にすると、Hibernate は null 文字列を空の文字列に置き換えようとしなくなりました。しかし、他のコードの一部が MySQL 構文に関連付けられているため、これを行うことはできません。
何か案が ?