2012-04-03 34 views
1

在删除父项时,JPA是否可以自动取消子项? 我有一个模型类设备,附有同步统计信息。当我删除设备时,我仍然想保留统计信息,因此请将Statistics类中的现场设备设置为“空”。在Hibernate/JPA中删除对象并自动取消子项

@OneToMany (mappedBy = "device", fetch= FetchType.LAZY) 
public List<Statistic> syncStats; 

@ManyToOne (fetch= FetchType.LAZY) 
public Device device; 

有没有获得此效果自动方式或做我必须做手工?

目前我使用:

@PreRemove 
protected void removeLinkToStats() { 
    syncStats.clear(); 
} 

但仍给人以 “A javax.persistence.PersistenceException已经被抓住了,org.hibernate.exception.ConstraintViolationException:无法执行JDBC批处理更新”

+0

你不允许访问/修改等entites的生命周期中的回调方法(它在JPA规范),这就是为什么你所得到的例外。如果你对这个除了使用orphanRemoval = false之外什么都不做,会发生什么呢? – esej 2012-04-03 11:28:08

+0

不,我仍然得到相同的错误:一个ja​​vax.persistence.PersistenceException被捕获,org.hibernate.exception.ConstraintViolationException:无法执行JDBC批量更新 – 2012-04-03 11:34:17

+0

那么,以下似乎的作品。如果你想建议它作为答案,然后我接受它指向我的方向: @PreRemove public void testing(){ for(Statistic stat:syncStats){ stat.device = null; stat.save(); } } – 2012-04-03 13:10:08

回答

0

Is it possible with JPA to automatically nullify children when deleting the parent?

不。对于JPA,应用程序有责任保持同步。在使用JPA删除实体之前,您的应用程序应调用业务逻辑。

当然有多种方式。使用诸如PreRemove或PreDestroy或(我个人最喜欢的)之类的注释在商业容器中执行预先删除的事情,这些商业容器会调用您的数据访问权限以从数据库中删除该实体。

短的例子:

class Business 
{ 
    DataAccess dataAccess; 
    //..... 

    public void removeEntity(Entity e) 
    { 
     //do pre removal here 
     dataAccess.remove(e); 
    } 
    //...... 
} 

class DataAccess 
{ 
    EntityManager em; 

    //...... 

    public void remove(Entity e) 
    { 
     em.remove(e); 
    } 

    //.... 
}