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

Suy*_*ash 5 java orm hibernate jpa-2.0

在检索具有双向多对多关系的实体的数据时,我遇到了问题。如果List用于存储实体,则无法同时获取多个包错误。如果我将代码更改为use Set,则会出现stackoverflow错误。

细节 :

  • 春季3.0.3
  • 休眠核心:3.5.1-Final
  • 休眠注释:3.5.1-最终
  • 休眠公共注释:3.2.0-最终
  • 休眠实体管理器:3.5.1-Final
  • MySQL数据库
  • Junit 4

用户有许多银行帐户;银行帐户可以有许多用户

User.java

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

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>();
Run Code Online (Sandbox Code Playgroud)

数据库表

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 )
Run Code Online (Sandbox Code Playgroud)

问题

  1. 当我尝试getAllUsers使用JUnit测试用例获取所有用户数据()时,无法同时获取多个数据包错误。
  2. 如果我分别使用SetHashSet而不是List和ArrayList,则会出现stackoverflow错误。

请帮助我,让我知道代码是否错误或我正在使用的特定版本的libs的已知休眠问题。

kol*_*ist 6

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

  • 另一种方法是使用“@ToString.Exclude”和“@EqualsAndHashCode.Exclude”注释字段 (3认同)

Noa*_*evo 3

您无法在两个列表上映射多对多关系,hibernate 将尝试为每个嵌套元素获取一个集合,即用户列表中的每个用户都有一个银行帐户列表,其中有一个用户列表...。将其想象为永无止境的递归。

  • 我能够通过从 toString() 方法中删除其他实体的引用来解决该问题。即从 User 对象的 toString 方法中删除 BankAccount 的引用,反之亦然。我还从所有实体中删除了 fetch=fetchType.EAGER。但是,我认为 hibernate 能够检测到这种循环依赖关系并且不会抛出 stackoverflow 异常。 (4认同)