Hibernate 发现对集合的共享引用异常

问题描述 投票:0回答:1

我遇到了与“找到对集合的共享引用”相关的异常,但我找不到任何解决方案来克服。问题发生在以下条件下。

我们假设表 1 和表 2 类似

Table-1
ID   Code Other Columns
1    A    . . . . . 
2    A    . . . . .
3    B    . . . . .


Table-2
ID   Source Other Columns
1    A    . . . . . 
2    A    . . . . .
3    B    . . . . .

class Table1 {
   @Id
   private Long id;
   @Column(name = "CODE")
   private String code;
   @OneToMany
   @JoinColumn(name = "SOURCE", referencedColumnName = "CODE")
   private List<Table2> table2List = new ArrayList<>();
}

class Table2 {
   @Id
   private Long id;
   @Column(name = "SOURCE")
   private String source;
 }

当我加载Table-1的所有数据时,将像往常一样有3个元素。问题从这里开始。 firstsecond元素的table2List变量(代码为A)是相同的PersistentBag,相同的集合实例(它有2个元素)并且Hibernate在事务时抛出Found共享引用集合异常承诺。集合已经由 Hibernate 创建,而不是我。据我看来,这似乎是休眠错误。我不知道为什么 hibernate 不为不同的元素创建不同的集合,而是将相同的集合设置到不同的元素中。我该如何解决这个问题?

hibernate spring-data-jpa spring-data
1个回答
0
投票

我找到了一个解决方法。刚刚将 @Access(AccessType.PROPERTY) 添加到 table2List 并更新了 setter 方法以创建新的 Arraylist。它工作正常。

import javax.persistence.Access;
import javax.persistence.AccessType;

class Table1 {
  @Id
  private Long id;
  @Column(name = "CODE")
  private String code;

  @OneToMany
  @JoinColumn(name = "SOURCE", referencedColumnName = "CODE")
  @Access(AccessType.PROPERTY) // update-1
  private List<Table2> table2List = new ArrayList<>();

  // update-2
  public void setTable2List(List<Table2> table2List) {
     this.table2List = new ArrayList<>(table2List);
  }  
  

}

© www.soinside.com 2019 - 2024. All rights reserved.