我目前正在将一些现有代码从 Hibernate 3.2 迁移到 Hibernate 3.6.10.Final(顺便说一下,从 Spring 2.0 迁移到 Spring 3.1.2)。
我对针对 H2 数据库运行的一些集成测试有疑问,验证某些字段不可为空。- 我测试将空字符串插入标记为 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] 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 不再尝试用空字符串替换我的空字符串。但我不能这样做,因为其他一些代码与 MySQL 语法相关联。
任何的想法 ?