为什么我应该指定@Column(nullable=false)?

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

59
更好的错误信息和错误处理,特别是如果您还添加了JSR303@NotNull注释。如果您将列创建为NOT NULL但未告诉JPA它不为空,JPA将假定空值是可以的。当您尝试保存具有nulls的对象时,它将继续将其发送到DB,并且您将获得DB级别错误。这会增加数据库中的日志垃圾,并且很难从错误中确定哪些表格的哪些列是问题,更不用说将它们映射回它们的JPA名称了。如果您将它们注释为不为空,JPA将在保存之前抛出异常,避免DB日志垃圾并通常为您提供更好的错误信息。特别是,如果您的JPA提供程序支持JSR303,并且将nullable=false内部转换为@NotNull,或者您也添加了@NotNull,它将为您提供一个数据结构,您可以检查以查看哪些对象的哪些字段由于什么原因被拒绝,以及自定义模板化错误消息。
这就是为什么你应该告诉JPA关于“NOT NULL”字段的原因。此外,这样做可以让其他人更容易理解你的代码,而不必阅读数据库模式。

1
好的,但是你的回答中不清楚你是否认为同时拥有@NotNull和@Column(nullable = false)有附加值。你认为呢? - ymajoros
1
@ymajoros 这有点取决于你的 JSR303 / JPA 集成有多聪明。我倾向于将两者都放在一起,但是良好的 JPA JSR303 集成会为那些可为空但设置了 nullable=false 的列添加一个隐式 NotNull。 - Craig Ringer
3
他们应该吗?如果不是规范的一部分,我不明白为什么以及在什么情况下需要。我宁愿使用@NotNull而不是nullable=false,因为后者只适用于jpa。我的问题更多关于@Column(nullable=false)的附加价值。 - ymajoros

34
此外,如果您的列在@ManyToOne注解中具有nullable = false,Hibernate将使用INNER JOIN查询相关表。 nullable = true则返回LEFT JOIN
这是另一个差别。

4

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

  • 如果您使用JPA提供程序生成模式(无论是通过maven还是通过自动生成如hbm2ddl.auto),那么它很重要。
  • 如果您配置JPA提供程序根据实体模型验证模式,则需要将它们同步。

第一个假设可以忽略,因为hbm2ddl.auto不适用于生产环境,我正在使用Maven和带有Arquillian的托管JBoss实例测试我的项目。至于第二个问题,它只对验证我的模式有用吗?在这种情况下,我认为它带来的冗长并不值得,除非有比这更好的理由。 - Fagner Brack
2
将实体模型和数据库模式保持同步非常重要。现在你可能用不到它,但以后你可能会添加需要它的工具。相关信息请参见 http://techblog.bozho.net/?p=1100。 - Bozho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接