Hibernate:删除集合子项

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

有人能解释一下这个行为吗?谢谢!

感谢 flush() !!! - aldo.roman.nurena
1个回答

1
在第二个示例中,您需要对房屋进行持久化以使房间删除生效。
在第一个代码中,您正在从EntityManager持久性上下文中删除对象(并且实体管理器注册了您的删除),然后使用flush()应用此操作将房间从数据库中删除。
在第二个示例中,您调用了List.remove():您没有通知EntityManager从数据库中删除对象; 当您执行house.getRooms().remove(room)时,orphanRemoval会起作用,因为您正在修改房屋,并且需要告诉entityManager使用EntityManager.persist()应用此修改; orphanRemoval完成其余部分,因为检测到已删除的房间是孤立的。

你说得对,我只是忘记复制这一行代码 “getEntityManager().flush();”。 但在第一个示例中,实体并没有从数据库中移除,在集合 “house.getRooms()” 中仍然存在。 - jaroh
我认为在删除房间之前,您必须设置 room.setHouse(null) 来告诉 Hibernate 您的单个对象(不是通过 List.remove() 删除)尚未附加到任何房屋,并且可以安全地删除。 - Luca Basso Ricci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接