3

我正在尝试将 JPA 与 Hibernate 一起使用来从现有模式中读取数据。我无法修改架构。有一个包含多个子类的 User 类。其中一些子类具有存储在连接表中的附加数据,而有些则没有。作为一个具体的例子,考虑以下 3 个类和 2 个表。(实际上,有几十个变体和大约十几个表。)

  • User是公共基类。它包括一个名为 userType 的鉴别器列。该表USER包含所有User类共有的数据,包括数值USERID
  • StandardUser是一种没有额外数据的变体。
  • LoginUser是另一个具有用户名和密码的变体,存储在与onLOGIN_USER连接的表中。USERUSERID

以下适用于 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;
    ....
}

它生成连接USERLOGIN_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 的加载时间代码重写冲突有关。)

4

1 回答 1

1

我应该花更多时间研究相关问题。看来,通过 JPA 注释更改类层次结构分支中的继承策略中提出的策略将满足我的需要。

具体来说,如果我将代码更改为如下所示,它将编译并运行并通过我的单元测试。

@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;
    ....
}
于 2013-03-25T21:20:00.720 回答