假设Hibernate 4.2 JPA 2.0实体class EntityA
,它包含@ManyToOne
字段List<EntityB> bs
。到目前为止,我坚信我不能用bs
列表替换new
,而是必须使用列表方法clear
,add
和remove
到目前为止,我想向大学展示一下,当我用一个新的替换List时它会引起问题,但没有什么奇怪的,它起作用,数据库和实体都得到了正确的更新。现在我很困惑:是否使用hibernate 4.x JPA 2允许替换持久化实体的集合?
具有OneToMany关系的两个团队由一个站点维护。
@Entity
public class EntityA {
@Id long id;
@OneToMany public List<EntityB>bs;
}
@Entity
public class EntityB {
@Id long id;
hashCode and equals based on id
}
测试,没有发现问题
@Test
@Transactional
public testReplaceSet {
//given: a persistent entity a that contains a persistent entity b1
EntityA a = this.entityManager.persist(new EntityA());
EntityB b1 = this.entityManager.persist(new EntityB());
a.bs = new ArrayList();
a.bs = b1;
this.entityManager.flush();
//when: assining a NEW List with an new persistent Entity b2
EntityB b2 = this.entityManager.persist(new EntityB());
a.bs = new ArrayList();
a.bs = b2;
long aId = a.id;
this.entityManager.flush();
this.entityManager.clear();
//then: the collection is correct stored
EntityA AReloaded = this.entityManager.find(EntityA.class, aId);
//here I expected the failure, but there was no!
assertEquals(b2, AReloaded.bs.get(0));
}
答案 0 :(得分:0)
替换列表内容时必须触发DB中的某些操作,可能会出现问题。
例如,有关此方案的一个已知陷阱与orphanRemoval = true
/ CascadeType.DELETE_ORPHAN
的列表有关。在这种情况下,替换列表时不会触发孤立删除。
也许你在不同的情况下也可能面临其他类似的问题。