我有两个实体与双向OneTomany/ManyToone关系相连。
@Entity
class One {
@OneToMany(mappedBy = "one", orphanRemoval = true, fetch = FetchType.EAGER)
private Set<Many> manies;
// ...
}
@Entity
class Many {
@ManyToOne
@JoinColumn(name = "one_id", nullable = false)
private One one;
// ...
}
添加和删除实例是用Spring数据存储库完成的。移除看起来或多或少是这样的:
one.getManies().remove(manyToRemove);
oneDao.save(one);
manyDao.delete(manyToRemove);
我稍微调试了一下,发现set
是一个Hibernatepersistentset
,它包含一个字段storedsnapshot
。这又是另一个集
,它仍然引用已删除的实体。我不知道为什么这个引用没有从快照中删除,但我怀疑这就是问题所在:我认为Hibernate试图第二次删除实体,因为它在快照中,而不在实际集合中。我找了很长时间,但我没有遇到其他人有类似的问题。
我使用Hibernate 4.2.2和Spring Data 1.6.0。
我也有同样的问题。
一个解决办法是替换整个集合。
Set<Many> maniesBkp = one.getManies(); // Instance of PersistentSet
maniesBkp.remove(manyToRemove);
Set<Many> manies = new HashSet<Many>();
manies.addAll(maniesBkp);
one.setManies(manies);
...
manyDao.delete(manyToRemove);
...
oneDao.save(one);
问题内容: 我正在尝试使用JPA建立双向关系。我了解这是应用程序负责维护双方关系的责任。 例如,一个图书馆有多本书。在图书馆实体中,我有: 图书实体为: 不幸的是,OneToMany端的集合为空。因此,例如,对setLibrary()的调用失败,因为this.library.getBooks()。contains(this)导致NullPointerException。 这是正常行为吗?我应该自己
我有两个具有一个任意关系的表 类ServiceProvider{ ... @OneTomany(Fetch=FetchType.Eager,MappedBy=“ServiceProvider”,Cascade={CascadeType.All,CascadeType.Remove},OlphanRemove=true)@OnDelete(action=OnDeleteAction.Cascade)
问题内容: 我有一个具有单向一对多关系的类,如下所示: 通常,获取此订单的内容很简单: 但是无论出于何种原因,我都可能希望以某种方式过滤结果并仅以最快的方式检索部分商品集合,例如高于一定价格,低于一定库存的所有商品(不返回然后全部过滤)然后)。为此,我将运行HQL查询以检索特定订单的商品,并将更多内容添加到我的where子句或查询对象中。 凭直觉我会想要这种行为(这是完全错误的): 但是当然这是错
srem key member 成功返回1,如果member在集合中不存在或者key不存在返回0,如果key对应的不是set类型的值返回错误
问题内容: AFAIK有两种方法: 遍历集合的副本 使用实际集合的迭代器 例如, 和 是否有任何理由偏爱一种方法(例如,出于可读性的简单原因而偏爱第一种方法)? 问题答案: 让我举几个例子,并提出一些避免方案。 假设我们有以下藏书 收集并删除 第一种技术是收集所有要删除的对象(例如,使用增强的for循环),并在完成迭代后删除所有找到的对象。 假设你要执行的操作是“删除”。 如果要“添加”此方法也可
AFAIK,有两种方法: 迭代集合的副本 使用实际集合的迭代器 例如, 而且 有没有理由偏爱一种方法而不是另一种方法(例如,由于可读性的简单原因而偏爱第一种方法)?