Hibernate @基本(可选=false)vs@Column(可空=false)vs@NotNull

Hibernate @基本(可选=false)vs@Column(可空=false)vs@NotNull,hibernate,validation,jpa,jsr,Hibernate,Validation,Jpa,Jsr,在这三个选项中,我应该使用一个、两个还是全部三个选项来防止空值 @NotNull @Column(name = "SOME_VALUE", nullable = false) @Basic(optional = false) private String someValue; 注意,我不认为这是一个现存问题的重复。< /强>我看到询问这三个选项的一个子集,但还没有找到一个询问三个选项中哪一个适合在现代JPA/Hibernate堆栈中使用。 < P> @ NothNo. 属于javax.va

在这三个选项中,我应该使用一个、两个还是全部三个选项来防止空值

@NotNull
@Column(name = "SOME_VALUE", nullable = false)
@Basic(optional = false)
private String someValue;

<强>注意,我不认为这是一个现存问题的重复。< /强>我看到询问这三个选项的一个子集,但还没有找到一个询问三个选项中哪一个适合在现代JPA/Hibernate堆栈中使用。

< P><强> @ NothNo.<强>

  • 属于
    javax.validation.constraints
  • 作为模式创建的一部分,在DB列上创建NOTNULL约束
  • 由验证引擎(VE)处理

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

  • 正如属性验证一样 由VE处理,在非持久性层(如UI)中非常有用 层(JSF)

  • @Basic(可选=false)

  • 属于
    javax.persistence
  • 作为模式创建的一部分,在DB列上创建NOTNULL约束
  • 由持久性提供程序(PP)处理
  • 如果在持久化时未设置属性(或设置为null),则PP不会将语句传递给DB;它抛出一个异常
  • @列(nullable=false)

  • 属于
    javax.persistence
  • 作为模式创建的一部分,在DB列上创建NOTNULL约束
  • 由持久性提供程序(PP)处理
  • 如果在持久化时未设置属性(或设置为null),则PP不会将语句传递给DB;它抛出一个异常
  • 允许指定附加参数,如列名(可以不同于属性名)

  • 可能是@Zeus的重复,我已经解释了为什么我认为这不是那个问题的重复。如果您使用的是验证器,
    @NotNull
    将在进行查询之前生成一个异常。如果您使用的是
    @Column(nullable=false)
    并且您使用JPA生成表,那么在插入/更新时将出现异常
    @Basic(optional=false)
    也在架构生成过程中使用,因此在插入/更新时由于约束冲突而生成异常,与
    @Column(nullable=false)
    相同。一般来说,自动验证会产生比预期更没有意义的错误消息,因此您可能需要手动执行。