带有Hibernate 3的JPA - ManyToMany-Stack溢出和多个包错误

java hibernate orm jpa-2.0

7168 观看

3回复

我在检索具有双向多对多关系的实体的数据时遇到问题。如果我List用于存储实体,我无法同时获取多个行李错误。如果我改变我的代码使用Set,我得到stackoverflow错误。

细节 :

  • Spring 3.0.3
  • Hibernate-core:3.5.1-Final
  • Hibernate-annotations:3.5.1-Final
  • hibernate-common-annotations:3.2.0-Final
  • hibernate-entitymanager:3.5.1-最终版
  • Mysql数据库
  • Junit 4

用户有很多银行账户; 银行帐户可以有很多用户

User.java

@ManyToMany(fetch = FetchType.EAGER, mappedBy="user") 
private List<BankAccount> bankAccounts = new ArrayList<BankAccount>();

BankAccount.java

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_bankaccount", 
           joinColumns = @JoinColumn(name="bank_account_id"), 
           inverseJoinColumns = @JoinColumn(name = "user_id")
)
private List<User> user = new ArrayList<User>();

数据库表

Users
user_id PK

Bankaccount
bank_account_id PK

user_bankaccount
bank_account_id PK ( references bankaccount.bank_account_id )
user_id PK ( references user.user_id )

问题

  1. 当我尝试getAllUsers使用JUnit测试用例获取所有用户data()时,我无法同时获取多个包错误。
  2. 如果我分别使用SetHashSet不是List ArrayList,我得到stackoverflow错误。

如果代码错误或者我正在使用的特定版本的lib的已知hibernate问题,请帮助我并告诉我。

作者: Suyash 的来源 发布者: 2019 年 7 月 8 日

回应 (3)


2

(让我们fetch暂时搁置这个属性)。您的映射完全有效,是映射双向多对多关系的正确方法。从JPA 2.0规范:

2.10.4双向ManyToMany关系

...

例:

@Entity
public class Project {
    private Collection<Employee> employees;

    @ManyToMany
    public Collection<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(Collection<Employee> employees) {
        this.employees = employees;
    }
    ...
}

@Entity
public class Employee {
    private Collection<Project> projects;

    @ManyToMany(mappedBy="employees")
    public Collection<Project> getProjects() {
        return projects;
    }
    public void setProjects(Collection<Project> projects) {
        this.projects = projects;
    }
    ...
}

在这个例子中:

  • 实体Project引用实体的集合Employee
  • 实体Employee引用实体的集合Project
  • 实体Project是关系的所有者。

...

话虽这么说,我不确定在两侧使用EAGER抓取时的行为(会导致无限循环吗?),JPA规范对此非常模糊,我找不到任何明确的提及它是被禁止的。但我敢打赌,这是问题的一部分。

但是在Hibernate的特殊情况下,我希望Hibernate能够处理Emmanuel Bernard的评论中提到的周期:

LAZY或EAGER应该与代码库中的无限循环问题正交。Hibernate知道如何处理循环图

有趣的是,我最近回答了一个非常类似的问题(非常接近的问题)。也许暗示Hibernate出了什么问题(我对上述评论的理解是,使用EAGER取两边都应该有效)。

因此,我将以相同的方式结束我的回答:如果您可以提供允许重现问题的测试用例,请打开Jira问题。

作者: Pascal Thivent 发布者: 21.10.2010 07:45

1

你不能在两个列表上映射多对多的关系,然后hibernate将尝试为每个嵌套元素获取一个集合,即用户列表中的每个用户都有一个银行账户列表,其中包含一个用户列表.... 想一想永无止境的递归。

作者: Noam Nevo 发布者: 21.10.2010 02:00

0

我遇到了类似的问题,根本原因是上面提到的Vjeetje的龙目岛代码。我的代码使用注释@Data,它生成具有交叉依赖字段的hashCode和ToString方法,这种结构导致Hibernate卡住。因此,我应该注意避免这些无限循环调用,在我的情况下,只需添加排除参数,如@EqualsAndHashCode(exclude =“dependent_list”)和@ToString(exclude =“dependent_list”)。它解决了堆栈溢出问题。

作者: kolya_metallist 发布者: 08.07.2019 11:40
32x32