嗯,我有一个关于 @Basic(可选= false)和 @NotNull 表示法的问题。
通常,我们会在实体类中编写变量,如下所示:
模拟代码:
@Basic(optional = false)
@NotNull
@Column(name = USERNAME)
private String userName;
上面的符号描述了字段用户名,它不接受 NULL 值。
通常, @Basic(可选= false)表示法后跟 @NotNull 表示法,但如果我想要一个字段,请说 userID ,它是自动增量类型,也是主键,如果我只是编写如下代码?
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = USERID)
private Integer userID;
或者删除 @Basic(optional = false)?
被修改
最新代码:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = USERID)
private Integer userID;
还有一个问题是,只有 @Basic(可选= false)与 @Basic(可选= false)相同,后跟 @ NotNull ?
代码如下所示:
代码1
@Basic(optional = false)
@NotNull
@Column(name = USERNAME)
private String userName;
代码2
@Basic(optional = false)
@Column(name = USERNAME)
private String userName;
答案 0 :(得分:6)
没有。 @Id
替换@Basic
- 使用其中一个。 @GeneratedValue
只能陪@Id
。
@NotNull
与JPA无关,您可以将其放在任何地方。
关于NotNull vs Column注释的更多信息 - 如this question中所述,NotNull和Column注释属性来自不同的地方(bean验证与持久性)并处理对象生命周期的不同方面:
@NotNull
是一个bean验证注释,指定该属性必须包含某些值。如果在您的设置中启用了hibernate-validator集成,则hibernate MAY 在将实体持久保存到数据库之前检查此项,但也可能完全忽略它。沿途的各种其他框架(API层中的jax-rs实现等)也可以检查您的bean以验证@NotNull是否成立。 hibernate 可能在生成数据库模式时也会注意到这个注释,并使该列不可为空,但它绝不需要这样做。
@Column
是JPA注释,仅处理您的属性如何映射到数据库。没有其他的。你可以使一个列不可为空,仍然将空值传递给hibernate。当hibernate尝试插入/更新你的数据时,它会导致数据库的运行时异常,但是hibernate不会提前检查它。
答案 1 :(得分:2)
即使Hibernate可能完全忽略与实体类关联的@NotNull'成员/财产,我们仍然可能需要使用它,因为: -