我目前正在将一些现有代码从Hibernate 3.2迁移到Hibernate 3.6.10.Final (顺便说一下,从Spring 2.0到Spring 3.1.2)。
我遇到了针对H2数据库运行的一些集成测试的问题,验证某些字段不可为空。 - 我测试尝试将空String插入标记为nullable = false的字段以异常结束 - 我检查了架构是否正确创建:列不可为空。
例如,如果我有一个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语法有关。
有什么想法吗?
答案 0 :(得分:0)
我没有足够的时间来挖掘Hibernate和MySQL方言,所以我使用@NotNull注释转移到Java Validation Framework。
它完成了工作并满足了我们的其他要求之一:我们的模型的一部分用于Grails应用程序,我们希望使用约束来验证部分CRUD操作(纯javax.persistence注释不可能)。 / p>