具有非可空字符串的H2 + Hibernate存储空字符串

时间:2013-01-16 14:10:43

标签: java hibernate h2

我目前正在将一些现有代码从Hibernate 3.2迁移到Hibernate 3.6.10.Final (顺便说一下,从Spring 2.0到Spring 3.1.2)。

我遇到了针对H2数据库运行的一些集成测试的问题,验证某些字段不可为空。 - 我测试尝试将空String插入标记为nullable = false的字段以异常结束 - 我检查了架构是否正确创建:列不可为空。

  • 使用H2(使用MySQL模式),忽略可空约束:在数据库中插入空字符串。
  • 如果我对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
}

我可以通过@NotNull注释替换nullable = false来解决这个问题,但是我不想在我庞大的代码库中替换它,因为我不期望相同的异常。 我快速浏览了Hibernate中的H2Dialect类和JIRA问题,但我没有找到任何东西。

有人知道它来自哪里吗?

编辑: 一些额外的信息,我在Hibernate日志中添加了TRACE级别。

  • 当我插入null并且字段标有@Column(nullable=false)时,我有以下日志: 2013-01-16 15:57:52 TRACE [BasicExtractor]找到 [] 作为列[NAME1_3 _]

  • 当我插入null并且字段未标记并带有@Column(nullable=false)时,我有以下日志: 2013-01-16 15:57:52 TRACE [BasicExtractor]找到 [null] 作为列[NAME1_3 _]

编辑(2013年1月22日):

我仍然没有找到问题的确切来源,但我发现它与H2绑定到MySQL模式:如果我禁用MySQL模式,Hibernate不再尝试用空字符串替换我的空字符串。 但我不能这样做,因为其他一些代码与MySQL语法有关。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我没有足够的时间来挖掘Hibernate和MySQL方言,所以我使用@NotNull注释转移到Java Validation Framework。

它完成了工作并满足了我们的其他要求之一:我们的模型的一部分用于Grails应用程序,我们希望使用约束来验证部分CRUD操作(纯javax.persistence注释不可能)。 / p>