【发布时间】:2013-02-17 08:45:31
【问题描述】:
我有一个带有 @Entity 注释的实体。
如果我负责创建CREATE TABLE 脚本,为什么我可以在数据库中使用NOT NULL 关键字创建列时指定@Column( nullable = false )?是否有任何示例显示在字段中使用此属性的好处?
【问题讨论】:
我有一个带有 @Entity 注释的实体。
如果我负责创建CREATE TABLE 脚本,为什么我可以在数据库中使用NOT NULL 关键字创建列时指定@Column( nullable = false )?是否有任何示例显示在字段中使用此属性的好处?
【问题讨论】:
更好的错误消息和错误处理,特别是如果您还添加了JSR303 @NotNull annotation。
如果您将列创建为 NOT NULL 但不告诉 JPA 它不为空,JPA 将假定空值是可以的。当您尝试使用空值保存对象时,它将继续将其发送到数据库,您将收到数据库级别错误。这会增加数据库中的日志垃圾邮件,并且更难从错误中确定哪些表的哪些列是问题,更不用说将它们映射回它们的 JPA 名称了。
如果您将它们注释为非空,JPA 将在保存之前抛出异常,避免 DB 日志垃圾邮件,通常会为您提供更好的错误。特别是,如果您的 JPA 提供程序支持 JSR303,并且在内部将 nullable=false 转换为 @NotNull,或者您也添加了 @NotNull,它将为您提供一个数据结构,您可以检查以准确了解对象的哪些字段由于什么原因被拒绝,以及可自定义的模板化错误消息。
这就是为什么你应该告诉 JPA NOT NULL 字段。这样,处理您的代码的其他人也更容易理解,而无需阅读 DB 架构。
【讨论】:
另外,如果你的列在@ManyToOne 注解中有nullable = false,Hibernate 会对相关表进行INNER JOIN 查询。 nullable = true 给出结果 LEFT JOIN。
这是另一个区别。
【讨论】:
在您的情况下,可能没有实际好处,但是:
【讨论】:
hbm2ddl.auto 不适合生产,我正在使用 maven 和 Arquillian 的托管 JBoss 实例测试我的项目。关于第二件事,那么只有验证我的模式才有用?在这种情况下,我认为它带来的冗长是不值得的,除非有比这些更好的理由。