4

我有一个名为“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();

谁能解释我这种行为?谢谢!

4

1 回答 1

1

在第二个示例中,您必须persist房屋才能使房间移除有效。

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

在您调用的第二个示例List.remove()中:不建议您EntityManager从数据库中删除对象;orphanRemoval当您调用时将起作用,entityManager().persist(house)因为当您这样做时,house.getRooms().remove(room)您正在修改房屋并且需要告诉 entityManager 应用此修改EntityManager.persist()orphanRemoval做剩下的删除删除的房间,因为检测为孤儿

于 2013-08-15T10:32:11.200 回答