Hibernate、JPA、joined表继承,当并非所有子类型都有自己的表时,会导致循环依赖错误
我试图将JPA与Hibernate结合使用,从现有模式中读取数据。我无法修改模式。存在一个具有多个子类的用户类。其中一些子类具有存储在联接表中的附加数据,而另一些子类则没有。作为一个具体的例子,考虑下面的3个类和2个表。(实际上,有几十种变体和大约十几个表。)Hibernate、JPA、joined表继承,当并非所有子类型都有自己的表时,会导致循环依赖错误,hibernate,inheritance,jpa,Hibernate,Inheritance,Jpa,我试图将JPA与Hibernate结合使用,从现有模式中读取数据。我无法修改模式。存在一个具有多个子类的用户类。其中一些子类具有存储在联接表中的附加数据,而另一些子类则没有。作为一个具体的例子,考虑下面的3个类和2个表。(实际上,有几十种变体和大约十几个表。) User是公共基类。它包括一个名为userType的鉴别器列。表USER保存所有USER类共有的数据,包括一个数值USERID值 StandardUser是一种没有附加数据的变体 LoginUser是另一个具有用户名和密码的变体,存储在
是公共基类。它包括一个名为userType的鉴别器列。表User
保存所有USER
类共有的数据,包括一个数值USER
值USERID
是一种没有附加数据的变体StandardUser
是另一个具有用户名和密码的变体,存储在表LoginUser
中,该表与LOGIN\u USER
上的USERID
连接USER
@Entity
@Table(name="USER")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="USERTYPEID", discriminatorType=DiscriminatorType.INTEGER)
public class User {
private @Id long userId;
private String userName;
private int userTypeId;
...
}
@Entity
@Table(name="USER")
@DiscriminatorValue("1")
public class StandardUser extends User {
}
@Entity
@Table(name="LOGIN_USER")
@DiscriminatorValue("2")
public class LoginUser extends User {
private String login;
private String password;
....
}
它在USERID
上生成连接USER
和LOGIN\u USER
(具有左外部连接)的SQL代码,并根据userTypeId值是1还是2正确创建StandardUser或LogiUser
当我用Hibernate而不是OpenJPA链接相同的代码时,我会收到错误消息
Caused by: org.hibernate.AnnotationException: Foreign key circularity dependency involving the following tables:
错误消息中未列出任何表。我在异常上设置了一个断点,它试图解决“USER”和“USER”之间的“依赖关系”,或者看起来是这样。我已经在Hibernate版本3.6和4.1.7中尝试过这一点
(为什么不坚持使用OpenJPA?我有一个单独的问题,与加载时代码重写与JAXB冲突有关。)我应该花更多时间研究相关问题。看来,中提出的战略将满足我的需要 具体地说,如果我将代码更改为如下所示,它将编译、运行并通过单元测试
@Entity
@Table(name="USER")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="USERTYPEID", discriminatorType=DiscriminatorType.INTEGER)
@DiscriminatorValue("1")
public class User {
private @Id long userId;
private String userName;
private int userTypeId;
...
}
@Entity
@DiscriminatorValue("1")
public class StandardUser {
}
@Entity
@SecondaryTable(name="LOGIN_USER")
@DiscriminatorValue("2")
public class LoginUser extends User {
@Column(table="LOGIN_USER")
private String login;
@Column(table="LOGIN_USER")
private String password;
....
}