【问题标题】:How do I insert the null value in a Boolean attribute when using Hibernate?使用 Hibernate 时如何在布尔属性中插入空值?
【发布时间】:2010-06-01 15:23:41
【问题描述】:

我有一个带有布尔属性的类。当我实例化并持久化这个类时,布尔属性与“false”值一起存储,而不是预期的“null”。如何将布尔属性设置为“Null”?

【问题讨论】:

  • Morte Rolo 你能展示你的类和它的映射吗???
  • @Arthur Ronald F D Garcia:它只是一个带有 @Column 布尔属性的常规 @Entity 类。
  • 您的数据库必须这样做。您使用的是什么数据库和什么列类型?
  • SQLServer tinyint 默认为空
  • 你可能遇到了这个bugopensource.atlassian.com/projects/hibernate/browse/HHH-3716报告中提到了Sybase,但SQLServer是近亲。

标签: java hibernate null nullable


【解决方案1】:

首先,确保您定义的是 Boolean 对象,而不是 boolean 类型。

然后,如果您使用带有 JPA 属性的 Hibernate,那么您可以添加 @Column(nullable=true) 以明确告诉 Hibernate 该列应该默认为 NULL。

【讨论】:

  • 可空属性默认为真
  • 你的表的架构是什么?它是否允许该列中的 NULL 值?此外,您可以尝试调试创建新实例的代码。也许该值在您的代码中被初始化为 false。
  • 值显式初始化为“null”,“schema”表示该属性为tinyint,默认值为null
  • 您是否尝试过将您的布尔值设为默认值? Boolean value = null;
【解决方案2】:

这是一个奇怪的问题。带有null 值的Boolean 属性肯定应该存储为NULL,并且tinyint 列类型允许这样做。我自己无法调查这个问题,但我会这样做:

首先,我将激活 Hibernate 的 DML 语句和 JBDC 参数的日志记录,以确认 Hibernate 实际上正在传递NULL(它应该)。相关类别(章节3.5. Logging)为org.hibernate.SQLorg.hibernate.type

如果第一个测试没有发现问题,我会尝试通过一个简单的测试类进一步隔离它,使用原始 JDBC 插入一个带有null 值的Boolean(并阅读它)。如果这个测试不是肯定的,那么我会开始怀疑 JDBC 驱动程序。

顺便问一下,您使用的是什么 JDBC 驱动程序(和版本)?如果您使用的是 Microsoft 驱动程序,请尝试使用最新版本的 jTDS(反之亦然)。

【讨论】:

    【解决方案3】:

    首先你要确保你试图持久化的对象是布尔值而不是原始布尔值。其次,您可以将对应的列定义为 char(1),它可以保存 'Y'、'N' 或 null 值。最后,最重要的是在 hibernate.cfg.xml 中添加以下行:-

    <property name="query.substitutions">'Y'=true,'N'=false</property>
    

    如果您使用的是 hibernate.properties 文件,请使用以下文件:-

    hibernate.query.substitutions true 'Y', false 'N'
    

    这将帮助您将空值存储到布尔类型列。并且不要忘记在映射文件中将属性映射为 type="boolean"。

    【讨论】:

      猜你喜欢
      • 2018-11-09
      • 2017-09-22
      • 1970-01-01
      • 2021-09-30
      • 2016-12-04
      • 2020-07-04
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多