JPA中的@Basic(可选= false)vs @Column(nullable = false)

joa*_*vio 94 java orm jpa

JPA持久性@Basic(optional = false)@Column(nullable = false)JPA持久性之间有什么区别?

Pas*_*ent 92

Gordon Yorke(EclipseLink架构委员会成员,TopLink核心技术主管,JPA 2.0专家组成员)就这个主题写了一个很好的答案,所以我没有引用他,而是引用他的答案:

optional和 之间的差异nullable是评估它们的范围.' optional'关于属性和字段值的讨论的定义,并建议应在运行时内评估此功能.' nullable'仅用于引用数据库列.

如果实现选择实现,optional那么Persistence Provider应在内存中评估这些属性,并在SQL发送到数据库之前引发异常,否则将永远不会报告使用' updatable=false'' optional'违规.

  • @Xie Jilei:来自书:Java持久性与hibernate 2007,p.179:`@Basic(optional = false)@Column(nullable = false)`@Basic注释在Java对象级别将该属性标记为不可选.列映射上的第二个设置nullable = false仅负责生成NOT NULL数据库约束.Hibernate JPA实现在任何情况下都以相同的方式处理这两个选项,因此您也可以仅使用其中一个注释来实现此目的. (39认同)
  • 这意味着,如果您尝试使用空字段持久化实体,如果将其标记为optional = false(不联系数据库),则会抛出异常,并且实体将不会添加到JPA持久性上下文中.如果它只被注释为nullable = false,则实体将被添加到持久化上下文中,并且当尝试将实体写入数据库时​​(例如通过flush),它将尝试将实体写入数据库,这将拒绝这个和它会抛出异常. (8认同)
  • 那么,真的应该使用,也许两者都有? (6认同)
  • @rapt - 我不明白`@Basic注释标记该属性在Java对象级别上不是可选的.这是什么意思?所以,只有`@ Basic`就像说为所述变量设置数据库列`NOT NULL`? (2认同)