Java 关于实体对象中空值的最佳实践
我正在审阅一位同事的代码。在实体对象中,他设置了Java 关于实体对象中空值的最佳实践,java,hibernate,jakarta-ee,Java,Hibernate,Jakarta Ee,我正在审阅一位同事的代码。在实体对象中,他设置了nullable=false,并在setter中检查要设置的值不是null private TypeChampMaterielDefaillant typeChamp; @Column(name = "TYPE_CHAMP", nullable = false, length = 30) @Enumerated(EnumType.STRING) public TypeChampMaterielDefaillant getTypeChamp() {
nullable=false
,并在setter中检查要设置的值不是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
都会在某个时刻抛出异常。
(如果值为null
,则checkArgumentNotNull
将引发非法参数异常)
编辑
因此,如果我理解正确,nullable=false仅适用于模式生成,因此,如果数据库不是使用当前实体生成的,则可能会在数据库操作中保留一个null值参数nullable=false(您将无法使用此值保持实体为null)。额外的签入setter很有用,因为您将在更早的时候(在setter调用期间)得到异常,但这不是必需的。不,这是非常糟糕的做法。HibernateBean是一个Bean,任何类型的智能setter都是一个解决方案 请改用注释,如
@NotNull
如果您确实需要在测试/开发中抛出的东西,请使用Assertions 我想说nullable=false用于模式生成,而不是用于来自jpa的验证(除非某些第三方库在持久化之前用于验证) : 正如您所看到的,jpa规范没有谈到验证,除非hibernate或其他第三方这样做。对于hibernate validator的
nullable=false
语句,我也不能肯定
您最好使用一些验证器框架或使用@PrePersist、@PreUpdate
注释
Setter验证也很糟糕,如果用户根本不调用它呢?@PeterRader是的,但它会在持久化过程中发生,而不是调用Setter,我从来没有见过当您注释nullable=false并使用null保存时抛出异常,我想当您使用hibernate生成ddl模式时,这会很方便,hibernate可能会为它创建约束。@Elbek您是对的,但如果您使用hibernate生成架构,它将保证不会有空值。使用setter的想法是在设置值时获取异常,而不是在persistenceCorrection期间,Hibernate不保证,而是由db server实现。Hibernate只生成正确的ddl,就是这样。任何注释或“仅仅因为”?断言不应该只用于调试/测试目的吗?@holap是的,你是对的(我会说
debug/test/devel
)。因此,请改用注释。我写它只是因为如果有空值,setter将失效。如果您需要抛出的东西,那么使用AsserationError,但不要让它成为live-system的一部分。嗯,sais,这不是为了验证。是我的错。
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.