@Basic(optional = false) vs @Column(nullable = false) vs @NotNull
Posted
技术标签:
【中文标题】@Basic(optional = false) vs @Column(nullable = false) vs @NotNull【英文标题】: 【发布时间】:2017-03-31 17:05:16 【问题描述】:在这三个选项中,我应该使用一个还是两个或三个组合来防止空值?
@NotNull
@Column(name = "SOME_VALUE", nullable = false)
@Basic(optional = false)
private String someValue;
请注意,我不认为这是与现有问题的重复。我看到 many questions 询问这三个选项的一个子集,但尚未找到一个询问关于这三个中的哪一个适合在现代 JPA/Hibernate 堆栈中使用。
【问题讨论】:
Confusion: @NotNull vs @Column(nullable = false)的可能重复 @Zeus,我已经解释了为什么我认为这不是对那个确切问题的欺骗。 如果您使用验证器,那么@NotNull
将在进行查询之前生成异常。如果您使用@Column(nullable = false)
并且使用JPA 生成表,则插入/更新时会出现异常。 @Basic(optional = false)
也用于模式生成期间,因此由于违反约束而在插入/更新时会生成异常,与@Column(nullable = false)
相同。一般来说,自动验证会导致错误消息的意义不如预期,因此您可能需要手动进行。
【参考方案1】:
@NotNull
-
属于
javax.validation.constraints
包。
作为架构创建的一部分,在 DB 列上创建非空约束。
由验证引擎 (VE) 处理。
如果属性未设置(或设置为 null),则在持久化时,VE 会引发异常。
由于属性验证是 由 VE 处理,在 UI 等非持久层中很有用 层(JSF)。
@Basic(optional=false)
-
属于
javax.persistence
包。
作为架构创建的一部分,在 DB 列上创建非空约束。
由持久性提供程序 (PP) 处理。
如果在持久化时未设置属性(或设置为 null),则 PP 不会将语句传递给 DB;它会引发异常。
@Column(nullable=false)
-
属于
javax.persistence
包。
作为架构创建的一部分,在 DB 列上创建非空约束。
由持久性提供程序 (PP) 处理。
如果在持久化时未设置属性(或设置为 null),则 PP 不会将语句传递给 DB;它会引发异常。
允许指定附加参数,如列名(可以不同于属性名)。
【讨论】:
以上是关于@Basic(optional = false) vs @Column(nullable = false) vs @NotNull的主要内容,如果未能解决你的问题,请参考以下文章
Visual Basic 6.0中ByVal和ByRef的区别和应用示例!optional和缺省时的区别和应用示例!
@OneToOne(optional=false) 和 @JoinColumn(nullable=false) 一起使用