我有一个名为“House”的实体,其中包含多个“Room”,设置如下:
房子.java:
@Entity
public class House {
@OneToMany(mappedBy = "house", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Item> rooms;
...
}
房间.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();
谁能解释我这种行为?
谢谢!
最佳答案
在第二个示例中,您必须 persist
房子使房间移除有效。
在第一个代码中,您要从 EntityManager persistence context
中删除对象(和实体经理注册你删除)和flush()
应用此操作从数据库中删除房间。
在第二个示例中,您调用 List.remove()
: 你不是建议EntityManager
从数据库中删除对象; orphanRemoval
当您调用 entityManager().persist(house)
时将起作用因为当你这样做 house.getRooms().remove(room)
您正在修改房屋,需要告诉 entityManager 使用 EntityManager.persist()
应用此修改; orphanRemoval
做剩下的删除删除的房间,因为检测为孤儿
关于 hibernate :集合删除子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18250595/