java - H2 + Hibernate 与不可空字符串存储空字符串

标签 java hibernate h2

我目前正在将一些现有代码从 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] 发现 [] 作为列 [NAME1_3_]

  • 当我插入 null 并且该字段未标记时使用 @Column(nullable=false),我有以下日志: 2013-01-16 15:57:52 TRACE [BasicExtractor] 发现 [null] 作为列 [NAME1_3_]

编辑(22/01/2013):

我仍然没有找到问题到底出在哪里,但我发现它与 H2 的 MySQL 模式相关:如果我禁用 MySQL 模式,Hibernate 不会再尝试用空字符串替换我的空字符串。 但我不能这样做,因为其他一些代码片段与 MySQL 语法相关。

有什么想法吗?

最佳答案

我没有足够的时间深入了解 Hibernate 和 MySQL 方言,因此我转向使用 @NotNull 注释的 Java 验证框架。

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

关于java - H2 + Hibernate 与不可空字符串存储空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14360312/

相关文章:

java - 如何在没有特定顺序的情况下管理多个可调用线程结果?

java - 如何使用java计算极大指数数的余数?

junit - 使用 H2 数据库进行单元测试

Spring + Hibernate + H2 嵌入式数据库。数据如何保存?

java - Spring MVC 中从服务器端发布数据

java - 尝试使用 JavaFX 2 实现 "Caret Browsing"

java - 具有 Spring Boot 和事务边界的 graphql-spqr

java - 如何动态替换 Eclipse 插件的类加载器?

hibernate - TransientObjectException - 对象引用未保存的 transient 实例 - 在刷新之前保存 transient 实例

alfresco - 无法更新 Activiti 数据库架构 : unknown version from database: '5.20.0.1'