使用Annotations混合JOINT和SINGLE TABLE继承

时间:2013-02-25 18:58:28

标签: hibernate inheritance annotations mixed

我在论坛上看过类似的问题,但没有发现任何可以解决我正在寻找的问题(至少我可以说出来)。

我的情况是,我们有多个客户端,每个客户端都有多个请求类型。我想要完成的是让父表“请求”分成每个客户端的子表 - “ClientARequest”,“ClientBRequest”。从那里,我将有多个类映射到同一个客户端表。 “ClientARequest1”和“ClientARequest2”都映射到“ClientARequest”,类似于ClientB。我可以让第一部分工作没有问题JOINED继承。我可以让第二个工作也可以保存。但是,在获取时,hibernate正在创建最后一个映射类的实例,因此根据我使用fetched对象的方式,我会得到一个ClassCastException,否则我将没有正确的数据,因为它是错误的Class。 / p>

@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:
我已尝试在此线程How to mix inheritance strategies with JPA annotations and Hibernate?中使用该解决方案,但我无法正确映射子类BB1,BB2,CC1,CC2,因为它们的属性将放在基本父表A中。我希望他们的属性分别放在他们的直接父表BB,CC中。

1 个答案:

答案 0 :(得分:0)

我明白了。我按照How to mix inheritance strategies with JPA annotations and Hibernate?中找到的解决方案。我改变的唯一事情是将@MappedSuperclass添加到BB,CC级别,并将@Entity和@SecondaryTable移动到BB1,BB2,CC1,CC2级别。

相关问题