在Hibernate / JPA中删除对象并自动使子项无效

时间:2012-04-03 10:46:15

标签: java hibernate jpa cascade

JPA是否可以在删除父项时自动使子项无效? 我有一个模型类设备,附有同步统计信息。当我删除设备时,我仍然想保留统计信息,因此将Statistics类中的字段设备设置为“null”。

@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批量更新”

1 个答案:

答案 0 :(得分:0)

  

JPA是否可以在删除父级时自动使子项无效?

没有。使用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);
    }

    //....
}