我正在审查同事的代码。在他的实体对象中,他设置了nullable = false
,并且他还在设置器中检查要设置的值不是null
。
这有用吗?在任何情况下,nullable = false
都会在某个时刻抛出异常。
(如果值为checkArgumentNotNull
,null
将抛出非法参数异常。)
private TypeChampMaterielDefaillant typeChamp;
@Column(name = "TYPE_CHAMP", nullable = false, length = 30)
@Enumerated(EnumType.STRING)
public TypeChampMaterielDefaillant getTypeChamp() {
return typeChamp;
}
public void setTypeChamp(TypeChampMaterielDefaillant typeChamp) {
checkArgumentNotNull(typeChamp, "typeChamp");
this.typeChamp = typeChamp;
}
因此,如果我理解正确nullable = false仅适用于模式生成,因此如果数据库不是使用当前实体生成的,则可以保持空值
答案 0 :(得分:3)
参数nullable = false将在数据库操作上发生(您将无法使用此值的持久化实体等于null)。附加检查setter非常有用,因为您将在之前(在setter调用期间)获得异常,但不是必需的。
答案 1 :(得分:0)
不,这是非常糟糕的做法。 Hibernate-Bean是一个bean,任何类型的智能setter都是一种解决方法。
使用注释代替@NotNull
!
如果您真的需要在test / devel中引发的东西,请使用分词!
答案 2 :(得分:0)
我想说nullable = false用于模式生成,而不是用于jpa验证(除非某些第三方库在持久化之前用于验证)
11.2.2.1 Column
The following elements of the Column annotation are used in schema generation:
name
unique
nullable
columnDefinition
table
length (string-valued columns only)
precision (exact numeric (decimal/numeric) columns only)
scale (exact numeric (decimal/numeric) columns only)
See section 11.1.9 for the rules that apply to these elements and column creation. The AttributeOverride annotation may be used to override column
mappings.
正如你所看到的,jpa规范没有谈论验证,除非hibernate /或某些第三方这样做。关于那个nullable = false
语句的hibernate验证器,我并不乐观。
您最好使用一些验证器框架或使用@PrePersist, @PreUpdate
注释。
Setter验证也很糟糕,如果用户根本没有调用它怎么样?