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


Answers:


98

Gordon Yorke(EclipseLink体系结构委员会成员,TopLink核心技术负责人,JPA 2.0专家组成员)在此主题上写了一个很好的答案,因此,我不用表述他,而是引用他的答案

optional和 之间的区别nullable是评估它们的范围。' optional' 的定义讨论了属性和字段值,并建议应在运行时评估此功能。“ nullable”仅指数据库列。

如果实现选择实现,optional则这些属性应由持久性提供程序在内存中进行评估,并在将SQL发送到数据库之前引发异常,否则在使用' updatable=false'' optional'时将永远不会报告违规。


8
那么,到底应该使用哪个,也许两者都使用?
希耶莱2011年

39
@Xie Jilei:摘自本书:Hibernate 2007的Java持久性,p 179:@Basic(optional = false) @Column(nullable = false)@Basic批注将属性在Java对象级别上标记为非可选。第二个设置,列映射上的nullable = false,仅负责生成NOT NULL数据库约束。Hibernate JPA实现在任何情况下都以相同的方式对待这两个选项,因此您也可以为此目的仅使用一个注释。
全神贯注的

2
@rapt-我不明白The @Basic annotation marks the property as not optional on the Java object level.这是什么意思?因此,仅@Basic是说说使数据库列为NOT NULL变量?
Erran Morad 2014年

9
这意味着,如果您尝试使用null字段保留实体,则将其标记为optional = false(不与数据库联系)时,将引发异常,并且该实体不会被添加到JPA持久性上下文中。如果仅将其注释为nullable = false,则将实体添加到持久性上下文中,并且在尝试将实体写入数据库(例如,通过刷新)时,它将尝试将实体写入数据库,这将拒绝这样做,并且然后它将引发异常。
Ray Hulha 2015年

@RayHulha我尝试用“ @Basic(optional = false)”注释字段,并向数据库中添加了一个元组(此字段的值= null),没有引发异常!!希望您能解释一下对我来说,这种行为。
ziMtyth

4

因此,我使用JPA 2.1(EclipseLink)尝试了@Basic(optional = false)注释,结果发现该注释在实际使用中被忽略(至少对于String字段而言)。(例如,entityManager.persist调用)。

所以我去了规格书,并阅读了有关它。规格说明如下:http :
//download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/

基本(可选):字段或属性的值可以为null。这是一个提示,对于原始类型不予理;。它可以用于模式生成。

所以我认为这句话解释了在模式生成中使用的Basic(可选)的实际用例。(即:当您从Java实体类生成CREATE TABLE SQL时。例如,Hibernate可以这样做。)


1
有趣的是,另一个答案暗示了用于模式生成的是可为空的,而不是基本的(当它说“'nullable'仅用于引用数据库列”时)。仍然很混乱。我想为空的用于生成模式和基本(可选= FALSE)可以用于同样的目的?那有意义吗?
marcus

optional = false仅用于在运行时检查此约束。nullable = false创建数据库约束。对于应用程序,设置也是optional = false有意义的,因为它的评估比进入数据库并在那里检查约束要快
。.– nimo23
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.