Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Hibernate、JPA、joined表继承,当并非所有子类型都有自己的表时,会导致循环依赖错误_Hibernate_Inheritance_Jpa - Fatal编程技术网

Hibernate、JPA、joined表继承,当并非所有子类型都有自己的表时,会导致循环依赖错误

Hibernate、JPA、joined表继承,当并非所有子类型都有自己的表时,会导致循环依赖错误,hibernate,inheritance,jpa,Hibernate,Inheritance,Jpa,我试图将JPA与Hibernate结合使用,从现有模式中读取数据。我无法修改模式。存在一个具有多个子类的用户类。其中一些子类具有存储在联接表中的附加数据,而另一些子类则没有。作为一个具体的例子,考虑下面的3个类和2个表。(实际上,有几十种变体和大约十几个表。) User是公共基类。它包括一个名为userType的鉴别器列。表USER保存所有USER类共有的数据,包括一个数值USERID值 StandardUser是一种没有附加数据的变体 LoginUser是另一个具有用户名和密码的变体,存储在

我试图将JPA与Hibernate结合使用,从现有模式中读取数据。我无法修改模式。存在一个具有多个子类的用户类。其中一些子类具有存储在联接表中的附加数据,而另一些子类则没有。作为一个具体的例子,考虑下面的3个类和2个表。(实际上,有几十种变体和大约十几个表。)

  • User
    是公共基类。它包括一个名为userType的鉴别器列。表
    USER
    保存所有
    USER
    类共有的数据,包括一个数值
    USERID
  • StandardUser
    是一种没有附加数据的变体
  • LoginUser
    是另一个具有用户名和密码的变体,存储在表
    LOGIN\u USER
    中,该表与
    USERID
    上的
    USER
    连接
以下内容适用于OpenJPA:

@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;
    ....
}