我目前正在将一些现有代码从Hibernate 3.2迁移到Hibernate 3.6.10.Final
(顺便说一下,从Spring 2.0到Spring 3.1.2)。
我在针对H2数据库运行的某些集成测试中遇到了问题,这验证了某些字段不可为空。
-我测试了将null字符串插入标记为nullable = false的字段的尝试以Exception结尾
-我检查了是否正确创建了架构:该列不可为空。
使用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来解决此问题,但是我不想在庞大的代码库中替换它,因为我不希望出现相同的Exception。我快速浏览了Hibernate中的H2Dialect类和JIRA问题,但没有找到任何东西。
有人知道它来自哪里吗?
编辑:
一些其他信息,我在Hibernate日志中添加了TRACE级别。
当我插入null并将字段标记为
@Column(nullable=false)
时,我有以下日志:2013-01-16 15:57:52跟踪[BasicExtractor]找到[]作为列[NAME1_3_]
当我插入null且该字段未标记为
@Column(nullable=false)
时,我有以下日志:2013-01-16 15:57:52跟踪[BasicExtractor]找到[null]作为列[NAME1_3_]
编辑(22/01/13):
我仍然没有找到问题的确切出处,但我发现问题与H2绑定到MySQL模式:如果禁用MySQL模式,Hibernate将不再尝试用空字符串替换空字符串。
但是我不能这样做,因为其他一些代码与MySQL语法相关。
任何的想法 ?
最佳答案
我没有足够的时间来研究Hibernate和MySQL方言,所以我使用@NotNull注释转到Java验证框架。
它可以完成工作并满足我们的其他要求之一:模型的一部分在Grails应用程序中使用,并且我们希望使用约束来验证CRUD操作的一部分(使用纯javax.persistence注释是不可能的)。