我有一个像这样的Hibernate @Embeddable注释类



@Embeddable
public class DataWrapper {
    private DataWrapperType wrapperType;

    @ManyToOne
    private DataFactorX xFactor;
    @ManyToOne
    private DataFactorY yFactor;
    @ManyToOne
    private DataFactorZ zFactor;

    // Getters and Setters
}


而且很简单地在另一个实体中使用

@Entity
public class DataManager {
    private DataWrapper dataWrapper;

    public DataManager() {
        this.dataWrapper = new DataWrapper();
    }
}


但是当我稍后从Hibernate检索DataManager实例时,dataWrapper字段返回空值。

有什么解释吗?

最佳答案

我现在有了答案,但是我继续发布,因为对于Hibernate业余爱好者来说,这并不明显。基于this answer by ChssPly76,我现在看到当所有字段都为null时,Hibernate会将组件设置为null。这种行为是官方的,我发现here有记录:


  组件的空值语义是临时的。当重载包含对象时,Hibernate会假定如果所有组件列均为null,则整个组件均为null。这适合大多数目的。


这意味着,当您仍在使用设置字段的引用时,该字段将保持设置状态,但是如果您查询Hibernate再次检索该对象,则如果该字段的所有组件均为null,则该字段将为null。

希望这可以帮助其他人不要在其他正常工作的Java代码中追逐NullPointerException

10-01 05:35
查看更多