有关实体对象中空值的最佳实践

时间:2014-08-04 14:24:58

标签: java hibernate java-ee

我正在审查同事的代码。在他的实体对象中,他设置了nullable = false,并且他还在设置器中检查要设置的值不是null

这有用吗?在任何情况下,nullable = false都会在某个时刻抛出异常。 (如果值为checkArgumentNotNullnull将抛出非法参数异常。)

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仅适用于模式生成,因此如果数据库不是使用当前实体生成的,则可以保持空值

3 个答案:

答案 0 :(得分:3)

参数nullable = false将在数据库操作上发生(您将无法使用此值的持久化实体等于null)。附加检查setter非常有用,因为您将在之前(在setter调用期间)获得异常,但不是必需的。

答案 1 :(得分:0)

不,这是非常糟糕的做法。 Hibernate-Bean是一个bean,任何类型的智能setter都是一种解决方法。

使用注释代替@NotNull

如果您真的需要在test / devel中引发的东西,请使用分词!

答案 2 :(得分:0)

我想说nullable = false用于模式生成,而不是用于jpa验证(除非某些第三方库在持久化之前用于验证)

JPA 2.1 Specification

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验证也很糟糕,如果用户根本没有调用它怎么样?