gpt4 book ai didi

java - Hibernate - 如何级联删除分离的对象

转载 作者:行者123 更新时间:2023-11-29 09:26:10 25 4
gpt4 key购买 nike

我有一个 hibernate 对象,它被分离并使用 EJB 传输到厚 Java Swing 客户端。然后以某种方式修改对象并返回到服务器,然后服务器将修改后的对象更新到数据库。一切都适用于更改的属性,但我在如何删除 many-to-one 映射方面遇到了问题。

例如,给定以下映射:

<hibernate-mapping>
<class name="com.wg.common.bean.Patient" table="patient">
<id name="id" type="integer">
<column name="id" />
<generator class="sequence">
<param name="sequence">patient_id_seq</param>
</generator>
</id>
<many-to-one name="address" class="com.wg.common.bean.Address" cascade="all">
<column name="address_id" />
</many-to-one>
...

假设我有一个发送给客户端的患者对象。用户之前添加了一个地址。每位患者只能有一个地址。在客户端,如果用户删除地址,我会在返回到服务器之前对患者对象调用 setAddress(null)。当我到达服务器时,它将 address_id 字段保存为空,但将地址记录留在数据库中。我明白为什么要这样做。我只是打破了关系的一端。我最好使用 delete-orphan。但是,根据 Hibernate 文档,delete-orphan 不适用于 many-to-one 映射。正确的过程是在服务器上调用(伪代码):

Address address = patient.getAddress();
session.delete(address);
patient.setAddress(null);

此模式的问题在于,如果我想坚持简单地传回我想要保存的 Patient 对象的过程,我无法知道它是否有需要删除的地址。我必须做一些不太优雅的变通方法来解决这个问题,例如查询数据库以查看是否有地址,如果它在传递的对象中为 null 则将其删除,或者创建 setDeleteAddress(boolean),Patient 类中的 getDeleteAddress() 方法,如果用户想要删除地址,则在客户端设置这些方法。

另一种选择是使患者和地址之间的关联成为一对多。然后我可以使用 delete-orphan。但是,由于它实际上是一对一的关系,我需要像这样在 Patient 类中放置一些疯狂的 getter/setter,这样当没有真正的集合时,我就不会在我的代码中乱扔集合引用:

public Address getAddress() {
if(addresses != null && addresses.size() > 0) return addresses.get(0);
else return null;
}

有没有更好的方法来解决这个问题?您如何处理分离对象上的实体移除?

最佳答案

作为多对一 的映射地址似乎是您问题的根源。地址是这种关系中的“ parent ”,这没有多大意义。考虑将其映射为组件或一对一映射。任何一种方式都不应涉及集合。

关于java - Hibernate - 如何级联删除分离的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1262465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com