在一对多的主从关系中处理细节的删除 - 休眠
问题描述:
我有一个非常典型的一对多关系(一个请求记录和请求细节记录)通过休眠,从会话中分离,修改然后在用hibernate修改后再次保存,...现在假设其中一个细节记录在客户端被删除,并且我想坚持删除它(从数据库中删除它)...当前逻辑执行以下操作(每次更新时):再次检索所有从属记录,将客户端输入与持久记录进行比较,如果有任何记录丢失,这意味着将被删除,因此将调用session.delete
调用以删除指定记录......最后,实体更新session.update
....我想知道是否有另一种方法让提供者注意到记录被删除而未执行此操作c比较...任何帮助?在一对多的主从关系中处理细节的删除 - 休眠
答
你可以使用级联删除孤儿选项,让您的父母改变孩子的影响,如:
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval=true)
然后,你需要,使用Session.update()或Session.merge()来对脱管实例。这样,您所做的任何更改都将在事务结束时保存(提交时)。
这是我的代码示例:
session.persist(a1);
session.flush();
session.getTransaction().commit();//a1 saved
session.evict(a1);//a1 detached
a1.getTableBs().remove(0);//remove child
session.beginTransaction();
session.update(a1);//reattach a1
session.flush();
session.getTransaction().commit();
session.close();
而在像这样我的交易休眠运行查询的结尾删除子:
Hibernate:
delete
from
TABLE_B
where
ID=?
据我所知,孤儿拆除将无法正常工作只要孤立的对象被分离...因此,我将需要从数据库中再次读取整个实体...删除指定的详细对象,然后更新...这是相同的场景 –
没有它的工作,附加(使用合并/更新)它将删除在提交时被删除的子项。已经在我的本地尝试了这一点,以确保这是可行的。 – Angga
我只是在我的代码中试过它,并且正如所料,它只在删除完成而实体被管理完成的情况下才起作用,如果删除在实体被管理之前完成,它将不会反映在数据库中...只有新细节被添加但删除的细节仍然存在于数据库中 –