【问题标题】:Hibernate: Remove Item From Collection Without Initialazing休眠:从集合中删除项目而不初始化
【发布时间】:2015-06-03 17:45:16
【问题描述】:

我在使用 Hibernate 多对多集合时遇到了问题。 当我尝试从关系中删除一个项目时,休眠加载整个集合(太大)。 这是一个例子:假设 A 与 B 有多对多关系

public class A {

@ManyToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST,
  CascadeType.REFRESH }, fetch = FetchType.LAZY)
@JoinTable(name = "a_b", joinColumns = { @JoinColumn(name = "a_id", referencedColumnName = "id", unique = false) }, inverseJoinColumns = { @JoinColumn(name = "b_id", referencedColumnName = "id", unique = true) })
@Sort(type = SortType.COMPARATOR, comparator = AscBComparator.class)
private List<B> listB;

public List<B> getListB() {
   return listB;
}

}

// in other part

A.getListB().remove(concreteB);

当程序到达 A.getListB() 时,休眠加载整个集合。 有没有办法避免这种情况?我只想从连接表中删除该行。

我尝试过: @BatchSize 来限制 de collection 的大小,但最后我明白它并没有像我预期的那样工作。

@LazyCollection(LazyCollectionOption.EXTRA),没用

【问题讨论】:

  • 为什么不直接删除B呢?
  • 因为 B 仍然是我的域的一部分,我无法删除它。只是 B 不再与 A 相关。

标签: hibernate collections many-to-many


【解决方案1】:

如果 A 和 B 之间的关系是双向的,则获取 B,然后更新它,更改其 A 的值,使该值为 null 或其他值。 像这样的东西:

B b = bService.getBById(id);
b.setA(null); // or b.setA(anotherValueOfA);
bService.update(b);

它应该可以工作

【讨论】:

  • 关系不是双向的,在域中从 B 导航到 A 没有任何意义。但是如果我没有找到另一个解决方案,我会采取这条路径来改进表现。另一个想法是创建删除 sql 语句。
  • 我实现了双向,但是当我保存 B 时,它不会删除连接表中的 de 行。有什么想法吗?
  • 我意识到关系的所有者是 A,这就是我无法保存更改的原因。我不认为我可以改变所有权:(
  • 如果 B 是所有权,这就是解决方案 :)
猜你喜欢
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 2013-09-14
  • 2016-05-09
  • 2021-02-15
  • 1970-01-01
相关资源
最近更新 更多