我正在尝试将 JPA 与 Hibernate 一起使用来从现有模式中读取数据。我无法修改架构。有一个包含多个子类的 User 类。其中一些子类具有存储在连接表中的附加数据,而有些则没有。作为一个具体的例子,考虑以下 3 个类和 2 个表。(实际上,有几十个变体和大约十几个表。)
User
是公共基类。它包括一个名为 userType 的鉴别器列。该表USER
包含所有User
类共有的数据,包括数值USERID
。StandardUser
是一种没有额外数据的变体。LoginUser
是另一个具有用户名和密码的变体,存储在与onLOGIN_USER
连接的表中。USER
USERID
以下适用于 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;
....
}
它生成连接USER
和LOGIN_USER
(使用左外连接) on 的SQL 代码,并USERID
根据 userTypeId 值是 1 还是 2 正确创建 StandardUser 或 LoginUser。
当我将相同的代码与 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 的加载时间代码重写冲突有关。)