【问题标题】:Why should I specify @Column( nullable = false )?为什么要指定@Column( nullable = false )?
【发布时间】:2013-02-17 08:45:31
【问题描述】:

我有一个带有 @Entity 注释的实体。
如果我负责创建CREATE TABLE 脚本,为什么我可以在数据库中使用NOT NULL 关键字创建列时指定@Column( nullable = false )?是否有任何示例显示在字段中使用此属性的好处?

【问题讨论】:

    标签: java jpa jpa-2.0 nullable


    【解决方案1】:

    更好的错误消息和错误处理,特别是如果您还添加了JSR303 @NotNull annotation

    如果您将列创建为 NOT NULL 但不告诉 JPA 它不为空,JPA 将假定空值是可以的。当您尝试使用空值保存对象时,它将继续将其发送到数据库,您将收到数据库级别错误。这会增加数据库中的日志垃圾邮件,并且更难从错误中确定哪些表的哪些列是问题,更不用说将它们映射回它们的 JPA 名称了。

    如果您将它们注释为非空,JPA 将在保存之前抛出异常,避免 DB 日志垃圾邮件,通常会为您提供更好的错误。特别是,如果您的 JPA 提供程序支持 JSR303,并且在内部将 nullable=false 转换为 @NotNull,或者您也添加了 @NotNull,它将为您提供一个数据结构,您可以检查以准确了解对象的哪些字段由于什么原因被拒绝,以及可自定义的模板化错误消息。

    这就是为什么你应该告诉 JPA NOT NULL 字段。这样,处理您的代码的其他人也更容易理解,而无需阅读 DB 架构。

    【讨论】:

    • 好的,但在您的回答中不清楚您是否认为同时拥有@NotNull 和@Column(nullable = false) 有附加价值。你怎么看?
    • @ymajoros 取决于您的 JSR303 / JPA 集成的智能程度。我倾向于把两者都放进去,但是一个好的 JPA JSR303 集成会为 nullable=false 的列添加一个隐式 NotNull
    • 应该吗?如果它不是规范的一部分,我不明白为什么以及在什么情况下。我宁愿有@NotNull 但没有nullable=false,因为后者只是jpa。我的问题更多是关于@Column(nullable=false) 的附加值。
    【解决方案2】:

    另外,如果你的列在@ManyToOne 注解中有nullable = false,Hibernate 会对相关表进行INNER JOIN 查询。 nullable = true 给出结果 LEFT JOIN

    这是另一个区别。

    【讨论】:

      【解决方案3】:

      在您的情况下,可能没有实际好处,但是:

      • 如果您使用 jpa 提供程序来生成架构(通过 maven 或通过像 hbm2ddl.auto 这样的自动生成),那么这很重要
      • 如果您将 jpa 提供程序配置为根据实体模型验证架构,那么您需要它们保持同步。

      【讨论】:

      • 第一个假设可以忽略,因为hbm2ddl.auto 不适合生产,我正在使用 maven 和 Arquillian 的托管 JBoss 实例测试我的项目。关于第二件事,那么只有验证我的模式才有用?在这种情况下,我认为它带来的冗长是不值得的,除非有比这些更好的理由。
      • 让你的实体模型和数据库模式同步很重要。您现在可能不会使用它,但稍后您可能会添加需要它的工具。相关techblog.bozho.net/?p=1100
      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 2011-02-23
      • 2014-09-11
      • 2011-11-18
      • 1970-01-01
      相关资源
      最近更新 更多