Hibernate:集合删除子

时间:2013-08-15 10:13:37

标签: hibernate

我有一个名为“House”的实体,其中包含多个“Room”,其设置如下:

House.java:

@Entity
public class House {
    @OneToMany(mappedBy = "house", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Item> rooms;
    ...
}

Room.java:

@Entity
public class Room {
    @ManyToOne
    @JoinColumn(name = "houseId")
    private House house;
    ...
}

现在,如果我通过实体管理器直接删除房间,则不会删除它:

getEntityManager().contains(room); // returns true
getEntityManager().remove(room);
getEntityManager().flush();

如果我从集合中删除它,它将被删除:

house.getRooms().remove(room);
getEntityManager().persist();
getEntityManager().flush();

任何人都能解释一下这种行为吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

在第二个示例中,您需要persist房子以使房间移除有效。

在第一个代码中,您要从EntityManager persistence context删除对象(并且实体管理员注册您删除),flush()应用此操作从数据库中删除空间。

在第二个示例中,您调用List.remove():您不是建议EntityManager从数据库中删除对象;当您致电orphanRemoval时,entityManager().persist(house)会有效,因为当您执行house.getRooms().remove(room)时,您正在修改房屋并且需要告诉entityManager将此修改应用于EntityManager.persist(); orphanRemoval执行其余操作,删除删除的房间,因为检测为孤儿

相关问题