在编写实体类时使用@Basic(optional = false)

时间:2014-08-05 03:01:59

标签: java jpa orm

嗯,我有一个关于 @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;

2 个答案:

答案 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'成员/财产,我们仍然可能需要使用它,因为: -

  • 由于我们的Entity类实例将像任何其他POJO一样(在与持久化上下文关联之前),因此根据业务逻辑,我们可能确定特定属性永远不会为null。要实现此检查,我们需要使用@NotNull
相关问题