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

时间:2013-03-03 01:56:44

标签: java jpa jpa-2.0 nullable

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

3 个答案:

答案 0 :(得分:51)

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

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

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

这就是为什么你应该告诉JPA关于NOT NULL字段的原因。这样,在没有阅读数据库架构的情况下,处理代码的其他人也更容易理解。

答案 1 :(得分:27)

此外,如果您的列在nullable = false注释中有@ManyToOne,则Hibernate会对相关表执行 INNER JOIN 查询。 nullable = true结果为 LEFT JOIN

这是其他差异。

答案 2 :(得分:3)

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

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