@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的主要内容,如果未能解决你的问题,请参考以下文章

jira python 认证

Visual Basic 6.0中ByVal和ByRef的区别和应用示例!optional和缺省时的区别和应用示例!

持久收集 JPA

三剑客之awk basic

在 jpa 中保存对象之前如何知道 id

@OneToOne(optional=false) 和 @JoinColumn(nullable=false) 一起使用