1

現在、いくつかの既存のコードを 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 構文に関連付けられているため、これを行うことはできません。

何か案が ?

4

1 に答える 1