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.