gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:48:02 25 4
gpt4 key购买 nike

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

  • User是公共(public)基类。它包括一个名为 userType 的鉴别器列。表USER保存所有 User 共有的数据类,包括数字 USERID值(value)。
  • StandardUser是一种没有额外数据的变体。
  • LoginUser是另一种具有用户名和密码的变体,存储在表 LOGIN_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;
    ....
    }

    它生成连接 USER 的 SQL 代码和 LOGIN_USER (带有左外连接)在 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 的加载时间代码重写冲突有关。)

    最佳答案

    我应该花更多时间研究相关问题。看来 Changing the inheritance strategy in branches of the class hierarchy via JPA annotations 中提出的策略会做我需要的。

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

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

    关于当并非所有子类型都有自己的表时,Hibernate、JPA、连接表继承导致循环依赖错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15624824/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com