在Hibernate JPA实体中替换另一个列表是否合法?

时间:2013-04-09 20:11:17

标签: java hibernate jpa

假设Hibernate 4.2 JPA 2.0实体class EntityA,它包含@ManyToOne字段List<EntityB> bs。到目前为止,我坚信我不能用bs列表替换new,而是必须使用列表方法clearaddremove

到目前为止,我想向大学展示一下,当我用一个新的替换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));
}

1 个答案:

答案 0 :(得分:0)

替换列表内容时必须触发DB中的某些操作,可能会出现问题。

例如,有关此方案的一个已知陷阱与orphanRemoval = true / CascadeType.DELETE_ORPHAN的列表有关。在这种情况下,替换列表时不会触发孤立删除。

也许你在不同的情况下也可能面临其他类似的问题。