Java Hibernate忽略构造函数和setter

Java Hibernate忽略构造函数和setter,java,hibernate,jpa,Java,Hibernate,Jpa,当我尝试使用Hibernate 5.4.3从数据库加载一些对象时,遇到了一个奇怪的行为 假设我有一个类a,其中包含一个类B的实例。现在我想从数据库中加载类a,但对于某些实例,类B是空的。为了防止A和B之间存在空值,我使用了以下代码: @Entity public class A{ @Id @GeneratedValue private Long id; @OneToOne(cascade = CascadeType.ALL) private B b =

当我尝试使用Hibernate 5.4.3从数据库加载一些对象时,遇到了一个奇怪的行为

假设我有一个类a,其中包含一个类B的实例。现在我想从数据库中加载类a,但对于某些实例,类B是空的。为了防止A和B之间存在空值,我使用了以下代码:

@Entity
public class A{

   @Id
   @GeneratedValue
   private Long id;    

   @OneToOne(cascade = CascadeType.ALL)
   private B b = new B();

   public setB(B b){
       if(b == null){
           this.b = new B();
       }else{
           this.b =b;
       }
   }

   public B getB(){
       return this.b;
   }
}

现在,当我不知何故使用A时,我仍然得到没有B实例的A。这怎么可能呢?

好吧,getter/setters中的业务逻辑至少是可疑的,特别是如果将
null
传递给setter会导致像分配新的空白对象一样奇怪的事情


Hibernate不需要setter来构建实体,它可以通过反射来实现。您可以使用,这意味着使用了setter,但是对于这个用例,我不会这样做。保持你的getter/setter干净,而不是像XtremeBaumer建议的那样使用
@PostLoad
,或者更好的是,将它们保持为空,因为它们就是空的。如果我的数据库空值在加载时变成了一些奇怪的僵尸对象,我会很害怕。

你应该在一个额外的方法上使用
@PostLoad
,该方法检查
b
是否为空,如果是,根据你想要的创建一个新的,你也可以将b设置为可选的,如果需要,可以在实体之外处理它。我同意@epsilonmajorquezero,实体应该反映数据库的确切状态,并且应该在调用代码中管理B的缺失。