我在论坛上查看了类似的问题,但没有找到任何可以解决我正在寻找的东西(至少我能说的)。
我有一种情况,我们有多个客户,每个客户都有多种请求类型。我试图完成的是有一个父表“Request”,它为每个客户端拆分成一个子表 - “ClientARequest”,“ClientBRequest”。从那里,我将有多个类映射到同一个客户端表。“ClientARequest1”和“ClientARequest2”都映射到“ClientARequest”,对于ClientB也是如此。我可以让第一部分工作与 JOINED 继承没有问题。我可以让第二个工作以及保存。但是,在获取时,hibernate 正在创建最后一个映射类的实例,因此根据我如何使用获取的对象,我会得到一个 ClassCastException 或者我不会有正确的数据,因为它是错误的类。
@Entity(name="Request")
@Table(name = "REQUEST")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="MY_TYPE", discriminatorType=DiscriminatorType.STRING)
public class Request { ... }
@Entity(name="ClientARequest1")
@Table(name = "CLIENTAREQUEST")
@DiscriminatorValue("ClientA")
public class ClientARequest1 extends Request { ... }
@Entity(name="ClientARequest2")
@Table(name = "CLIENTAREQUEST")
@DiscriminatorValue("ClientA")
public class ClientARequest2 extends Request { ... }
ClientB 同样的事情:
@Entity(name="ClientBRequest1")
@Table(name = "CLIENTBREQUEST")
@DiscriminatorValue("ClientB")
public class ClientBRequest1 extends Request { ... }
@Entity(name="ClientBRequest2")
@Table(name = "CLIENTBREQUEST")
@DiscriminatorValue("ClientB")
public class ClientBRequest2 extends Request { ... }
因此,就像我提到的那样,创建了三个表,Request、ClientARequest 和 ClientBRequest,这在表之间进行区分是没有问题的。正是在尝试从表中获取时,hibernate 使用第二个映射来创建类的实例。
前任。
ClientARequest1 r = new ClientARequest1("ClientA");
dao.save(r);
按预期工作。
但是对于:
Request r = (Request) dao.findById(1l); //where id==1 is a ClientARequest1
实际上会拉回一个ClientARequest2。
任何想法将不胜感激。这个解决方案不可行吗,有没有办法将表格分解到另一个级别?
2/26/13 11:19 AM EST:
我已经尝试了这个线程中的解决方案如何将继承策略与 JPA 注释和 Hibernate 混合?,但我无法正确映射子类 BB1、BB2、CC1、CC2,因为它们的属性将放置在基父表 A 中。我希望它们的属性分别放置在它们的直接父表 BB、CC 中。