我有一个名为“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();
任何人都能解释一下这种行为吗? 谢谢!
答案 0 :(得分:1)
在第二个示例中,您需要persist
房子以使房间移除有效。
在第一个代码中,您要从EntityManager persistence context
删除对象(并且实体管理员注册您删除),flush()
应用此操作从数据库中删除空间。
在第二个示例中,您调用List.remove()
:您不是建议EntityManager
从数据库中删除对象;当您致电orphanRemoval
时,entityManager().persist(house)
会有效,因为当您执行house.getRooms().remove(room)
时,您正在修改房屋并且需要告诉entityManager将此修改应用于EntityManager.persist()
; orphanRemoval
执行其余操作,删除删除的房间,因为检测为孤儿