Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate继承-获取超类实例并转换为子类_Java_Hibernate - Fatal编程技术网

Java Hibernate继承-获取超类实例并转换为子类

Java Hibernate继承-获取超类实例并转换为子类,java,hibernate,Java,Hibernate,考虑一下这个场景 有地块,一些是住宅地块,一些是商业地块 也有业主。但业主只能购买一块地皮,它可以是住宅或商业用地 这是我的代码 @Entity @Table(name = "PLOT") @Inheritance(strategy = InheritanceType.JOINED) public abstract class Plot { private int id; private String number; private List<Owner> owners

考虑一下这个场景

有地块,一些是住宅地块,一些是商业地块

也有业主。但业主只能购买一块地皮,它可以是住宅或商业用地

这是我的代码

@Entity
@Table(name = "PLOT")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Plot {
  private int id;
  private String number;
  private List<Owner> owners = new ArrayList<>();

  // getters and setters...
}


@Entity
@Table(name = "RESIDENTIAL_PLOT")
@PrimaryKeyJoinColumn(name = "PLOT_ID")
public class ResidentialPlot extends Plot {
  // Some fields
}


@Entity
@Table(name = "COMMERCIAL_PLOT")
@PrimaryKeyJoinColumn(name = "PLOT_ID")
public class CommercialPlot extends Plot {
  // Some fields
}


@Entity
@Table(name = "OWNER")
public class Owner {
  private int id;
  private String name;
  private Plot plot;

  // getters and setters
}
@实体
@表(name=“PLOT”)
@继承(策略=InheritanceType.JOINED)
公共抽象类图{
私有int-id;
私有字符串编号;
私有列表所有者=新的ArrayList();
//接球手和接球手。。。
}
@实体
@表(name=“住宅小区”)
@PrimaryKeyJoinColumn(name=“PLOT\u ID”)
公共类住宅地块扩建地块{
//一些领域
}
@实体
@表(name=“商业用地”)
@PrimaryKeyJoinColumn(name=“PLOT\u ID”)
公共类商业情节扩展情节{
//一些领域
}
@实体
@表(name=“OWNER”)
公共类所有者{
私有int-id;
私有字符串名称;
私人地块;
//接球手和接球手
}
一切都很好,但当我调用
owner.getPlot()时
我期待着
ResidentialPlot
CommercialPlot
实例 因此,我可以通过使用
instanceof
操作符应用适当的操作。 但它不能同时满足这两个条件


我做错了什么?

您没有使用多态性,在JPA环境中,多态性的危害更大

您观察此行为的原因是因为Hibernate使用了代理。当Hibernate加载所有者时,它无法判断该地块是商业地块还是住宅地块。它必须进行额外的查询才能知道它。因此,它使用一个惰性代理初始化plot字段,该代理是动态生成的类的实例,该类扩展plot,但既不是CommercialPlot,也不是ResidentialPlot

在代理上调用方法时,代理通过从数据库获取绘图数据来初始化自身,并将其委托给CommercialPlot或ResidentialPlot的实例

解决方法是使用多态射。将抽象方法添加到Plot类(
getType()
,或
isResidential()
),并在这两个子类中实现它。如果这是不可能的,因为您需要依赖于实体类型但不应该在实体本身中的业务逻辑,请使用访问者模式


如果你需要更多的细节,我写了这个主题,但它是用法语写的。也许Google Translate可以帮助您。

您得到的是什么实例?您应用的是什么类型的操作?当然,它属于Plot类,不为空,包含所有有效信息,如数字字段。@KevinBowersox操作,如我需要为住宅地块贴上“Plot No.”,为商业地块贴上“Shop No.”标签!谢谢,今天学到了新东西。我想现在用一个抽象的方法就可以了:DNice回答,去了你的博客,但它只有法语,你有英文版本吗?