我遇到了与“找到对集合的共享引用”相关的异常,但我找不到任何解决方案来克服。问题发生在以下条件下。
我们假设表 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个元素。问题从这里开始。 first和second元素的table2List变量(代码为A)是相同的PersistentBag,相同的集合实例(它有2个元素)并且Hibernate在事务时抛出Found共享引用集合异常承诺。集合已经由 Hibernate 创建,而不是我。据我看来,这似乎是休眠错误。我不知道为什么 hibernate 不为不同的元素创建不同的集合,而是将相同的集合设置到不同的元素中。我该如何解决这个问题?
我找到了一个解决方法。刚刚将 @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);
}
}