【问题标题】:@Basic(optional = false) vs @Column(nullable = false) vs @NotNull@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 堆栈中使用。

【问题讨论】:

  • @Zeus,我已经解释了为什么我认为这不是对那个确切问题的欺骗。
  • 如果您使用验证器,那么@NotNull 将在进行查询之前生成异常。如果您使用@Column(nullable = false) 并且使用JPA 生成表,则插入/更新时会出现异常。 @Basic(optional = false) 也用于模式生成期间,因此由于违反约束而在插入/更新时会生成异常,与@Column(nullable = false) 相同。一般来说,自动验证会导致错误消息的意义不如预期,因此您可能需要手动进行。

标签: hibernate validation jpa jsr


【解决方案1】:

@NotNull

  1. 属于javax.validation.constraints 包。
  2. 作为架构创建的一部分,在 DB 列上创建非空约束。
  3. 由验证引擎 (VE) 处理。

  4. 如果属性未设置(或设置为 null),则在持久化时,VE 会引发异常。

  5. 由于属性验证是 由 VE 处理,在 UI 等非持久层中很有用 层(JSF)。

@Basic(optional=false)

  1. 属于javax.persistence 包。
  2. 作为架构创建的一部分,在 DB 列上创建非空约束。
  3. 由持久性提供程序 (PP) 处理。
  4. 如果在持久化时未设置属性(或设置为 null),则 PP 不会将语句传递给 DB;它会引发异常。

@Column(nullable=false)

  1. 属于javax.persistence包。
  2. 作为架构创建的一部分,在 DB 列上创建非空约束。
  3. 由持久性提供程序 (PP) 处理。
  4. 如果在持久化时未设置属性(或设置为 null),则 PP 不会将语句传递给 DB;它会引发异常。
  5. 允许指定附加参数,如列名(可以不同于属性名)。

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 2014-09-11
    • 2011-03-20
    • 2011-11-18
    • 1970-01-01
    • 2012-01-06
    • 2018-01-08
    • 2020-05-15
    相关资源
    最近更新 更多