是否有任何理由在Java实体类的@Id字段上放置@NotNull注释
我在实体类中找到了代码:是否有任何理由在Java实体类的@Id字段上放置@NotNull注释,java,jpa,bean-validation,Java,Jpa,Bean Validation,我在实体类中找到了代码: @Id @NotNull @Column(name = "ID") private Long id; 当设置了@Id时,@NotNull注释是否有价值?我的理解是,这是用于静态分析,与hibernate/orm无关。它是intellij特定的注释吗 因此,在编译时,当您将要为注释为@NotNull的字段分配NULL时,可能会收到警告 任何依赖的代码都知道返回的值永远不会为空。由于id/primary key在表中是最重要的,因此它可以唯一地标识表中的一行 所以它不应该
@Id
@NotNull
@Column(name = "ID")
private Long id;
当设置了@Id时,@NotNull注释是否有价值?我的理解是,这是用于静态分析,与hibernate/orm无关。它是intellij特定的注释吗 因此,在编译时,当您将要为注释为@NotNull的字段分配NULL时,可能会收到警告
任何依赖的代码都知道返回的值永远不会为空。由于
id/primary key
在表中是最重要的,因此它可以唯一地标识表中的一行
所以它不应该是空的
@Id
用于
* Specifies the primary key of an entity.
* The field or property to which the <code>Id</code> annotation is applied
* should be one of the following types: any Java primitive type;
* any primitive wrapper type;
* <code>String</code>;
* <code>java.util.Date</code>;
* <code>java.sql.Date</code>;
* <code>java.math.BigDecimal</code>;
* <code>java.math.BigInteger</code>.
所以它不考虑空值。为防止出现空值,请将
@NotNull
与@Id
一起使用。是,这将使您的Id字段不可为空,您必须将其设置为必填字段
但如果您想让id自动递增,请将其删除并添加
@GeneratedValue(strategy=GenerationType.AUTO)
@NotNull
用于验证目的,如@Size
。它定义了验证引擎检查用户输入是否正常的规则。围绕这些注释进行验证并不一定表明该对象也是一个JPA对象,但这两者通常一起使用
如果您使用的是javax.validation,而不是依赖于数据库级别的故障(违反约束)来指示空值,那么您应该同时使用这两种注释。如果您使用的是数据库自动递增值或序列,那么您不应该使用
@NotNull
注释。当您尝试持久化实体时,它将引发异常。嗯。。。我简化了代码,但原始代码有@SequenceGenerator
和@GeneratedValue
,并且在运行时插入时没有任何错误。。。似乎不同的库和版本表现不同。谢谢你的关心+1.谢谢+1.我读过,但这并不能帮助我理解…允许一个空主键将违反SQL规范。它来自JSR303(Bean验证),这就像JPA也是Java EE的一部分。谢谢+1。最直接的回答。