没有OneToMany的JPA Cascade删除与ManyToOne

时间:2014-03-18 19:06:50

标签: java jpa cascade cascading-deletes

我有以下对象结构:

public class Entity1 {  

    @OneToMany(orphanRemoval=true)
    private List<Entity2> listOfEntitys;
    ... 
}

public class Entity2 {  

    @OneToMany(orphanRemoval=true)
    private List<Entity3> listOfEntitys;
    ... 
}

public class Entity3 {  
    ...
}

//Here it can be thousand of it for one entity3
public class Entity4 {  

    @ManyToOne
    private Entity3 entity;
        ... 
}   

现在,我想要删除Entity1,所有实体也应该在级联上删除。
问题是,...如何删除级联中的所有entitys4

我尝试了两种解决方案:

  • 我在entity3上添加一个列表并在级联中删除它。

  • 我提出了两个问题:首先,我选择了entitys3中的所有entity1 - &gt; entity2比我删除所有entitys4。之后我可以逐级删除entity1/2/3,因为从43的实体引用会被删除。

给它另一个解决方案?我更喜欢哪种解决方案?

1 个答案:

答案 0 :(得分:0)

我更喜欢第一个解决方案但略有修改:

@Entity
public class Entity1 {
    @OneToMany(mappedBy = "entity1", orphanRemoval = true)
    private List<Entity2> listofentitys;
}

@Entity
public class Entity2 {
    @ManyToOne
    private Entity1 entity1;

    @OneToMany(mappedBy = "entity2", orphanRemoval = true)
    private List<Entity3> listofentitys;
}

@Entity
public class Entity3 {
    @ManyToOne
    private Entity2 entity2;

    @OneToMany(mappedBy="entity3", orphanRemoval = true)
    private List<Entity4> listofentitys;
}

@Entity
public class Entity4 {
    @ManyToOne
    private Entity3 entity3;
}

通过在实体之间引入双向关系,您可以避免连接表,从而在与底层数据库交换数据时提高整体性能。这种方法对我来说似乎比第二种方法更合理,因为JPA隐含地处理了所有事情。

删除实体可能如下所示:

public <T> void remove(Class<T> clazz, int id) {
    T entity = em.find(clazz, id);
    if (entity != null) {
        em.remove(entity);
    }
}

我希望它有所帮助。