Hibernate 使用注释混合联接和单_表继承

Hibernate 使用注释混合联接和单_表继承,hibernate,inheritance,annotations,mixed,Hibernate,Inheritance,Annotations,Mixed,我在论坛上寻找过类似的问题,但没有找到任何能解决我所寻找的问题(至少我能告诉你的) 我遇到的情况是,我们有多个客户机,每个客户机都有多种请求类型。我试图实现的是一个父表“Request”,它为每个客户机拆分成一个子表——“clientrequest”、“ClientBRequest”。从那里,我将有多个类映射到同一个客户机表。“ClientRequest1”和“ClientRequest2”都映射到“ClientRequest”,对于ClientB也类似。我可以让第一部分工作没有问题与联合继承。

我在论坛上寻找过类似的问题,但没有找到任何能解决我所寻找的问题(至少我能告诉你的)

我遇到的情况是,我们有多个客户机,每个客户机都有多种请求类型。我试图实现的是一个父表“Request”,它为每个客户机拆分成一个子表——“clientrequest”、“ClientBRequest”。从那里,我将有多个类映射到同一个客户机表。“ClientRequest1”和“ClientRequest2”都映射到“ClientRequest”,对于ClientB也类似。我可以让第一部分工作没有问题与联合继承。为了省钱,我可以让第二个也工作。但是,在获取时,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 { ... }
客户B也是这样:

@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、clientrequest和ClientBRequest,在表之间进行区分没有问题。hibernate正是在尝试从表中获取时使用第二个映射来创建类的实例

工作正常。
然而,对于:

Request r = (Request) dao.findById(1l);  //where id==1 is a ClientARequest1
将实际收回客户请求2

任何想法都将不胜感激。这个解决方案是不可行的吗?有没有办法将表格分解到另一个层次

美国东部时间2013年2月26日上午11:19:

我在这个线程中尝试了这个解决方案,但我无法正确映射子类BB1、BB2、CC1、CC2,因为它们的属性将被放置在基本父表A中。我希望它们的属性分别被放置在它们的直接父表BB、CC中。

我明白了。我遵循了在中找到的解决方案。我唯一改变的是将@MappedSuperclass添加到BB、CC级别,并将@Entity和@SecondaryTable移动到BB1、BB2、CC1、CC2级别

Request r = (Request) dao.findById(1l);  //where id==1 is a ClientARequest1