2017-03-08 62 views
0

我们使用spring-data hibernate作为ORM来访问我们的db。我已成立实体如下:Hibernate集合保留对已删除实体的引用

class E1 { 
    @Column(name = "e1_id") 
    private BigDecimal e1_id; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "e1", orphanRemoval=true, fetch = FetchType.EAGER) 
    @Fetch(value = FetchMode.SUBSELECT) 
    private Collection<E2> e2List; 
} 

class E2 { 
    @Column(name = "e2_id") 
    private BigDecimal e2_id; 

    @JoinColumn(name = "e1_id", referencedColumnName = "e1_id") 
    @ManyToOne 
    private E1 e1; 
} 

现在我尝试以下方法: 创建一个新的E1和节约使用JPA春天库,没有明确的Spring事务。

E1 detachedE1 = e1Repo.save(e1); 

e1有一个非空集合的e2。

我从e1中删除e2实体,然后在spring事务中保存e1。

然后,我尝试使用detachedE1如下:

detachedE1.setE2Collection(Collections.emptyList()) 
    e1Repo.save(detachedE1) 

上面的代码错误了,并且误差基本上说:

springframework.orm.jpa.JpaObjectRetrievalFailureException:无法找到实体.E2 with id 1.00

我的问题是,JPA如何保留对已删除集合的引用。我将E2集合设置为空列表。而且我还验证了由e1Repo.find(detachedE1.e1_id)返回的实体具有一个空集合。

在此先感谢您的回复/指点!

只想添加我们使用休眠休眠-的EntityManager-4.3.8.Final.jar

回答

0

所以最后使用调试器周围的Hibernate代码后挖想通了这一点。分离的实体集合实际上是一个PersistentBag,这应该不会太令人吃惊。 但是,持久性包保持snapShot,当我将集合设置为emptyList时不会清除它。

只是为了测试我的终极理论的缘故,我增加了以下内容:

((PersistentCollection)e1.getE2Collection()).setSnapshot(null, null, null); 

在此之后,休眠持续性方面能够成功合并分离的实体,与E2集合设置为空的清单。

相关问题