hibernate :集合删除子

标签 hibernate

我有一个名为“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/

相关文章:

java - 如何为非 ID 字段使用序列生成器?

java - 使用 Spring 和 Hibernate 从多个表连接中检索数据

java - 对于 JPA 元模型生成的类,Maven "clean install site"失败

java - Hibernate 一级缓存 - 它同步吗?

java - 避免 JPA 抽象类额外的表

hibernate - 使用 Hibernate 保存点

java - Hibernate 强制与 "central"实体的关系

java - 在 Extjs 中,在 Grid 中更新时,如果 session 超时如何重定向到登录页面?

java - Hibernate OneToMany SELECT 在实体映射中给出重复列

java - Hibernate 搜索 IndexedEmbedded 内存不足