3

背景:我正在为以下类实现持久性:

  • class Person

  • abstract class ContactInfo

    • Email extends ContactInfo
    • SnailMail extends ContactInfo

每个Person都有一个对ContactInfo对象的引用。(并且一个ContactInfo对象可以在多个Person之间共享。)

在我的用户界面中,我需要让用户编辑联系信息对象,并可能将电子邮件地址替换为蜗牛邮件地址。(如果要替换的联系信息对象在几个人之间共享,则所有这些人都应该更新他们的联系信息。)

然而,据我了解,Hibernate 拒绝更新鉴别器列,因此只需创建一个新的SnailMail对象,为其提供要替换的电子邮件对象的主键值,然后保存它是行不通的。

问题:允许用户将ContactInfo对象从Email更改为SnailMail的最佳方法是什么?

(这些对象是“短暂的”。它是 Web 应用程序的一部分,所有对象都会在每次请求时通过 HQL 重新读取,因此无需担心任何分离的对象。)

到目前为止我的想法:我意识到我可以删除旧对象,插入新对象。如果这是首选方法,我应该 (A) 尝试重用旧的主键值(在这种情况下我需要使用分配的生成器)还是 (B) 让后端为新对象生成新的 ID,并且更新人员联系人引用以指向新对象?

如果 (B) 是要走的路,我可以使用一些 HQL 语句更新引用,还是应该“手动”加载/更新/保存所有受影响的人员对象?

4

1 回答 1

0

我认为您不太可能使用不同类的全新实例来更新它。毕竟,您已经创建了一个新实体,因此它并不是真正的更新。

您确定 Person 不需要多个 ContactInfo(s) 吗?如果关系是many2many,您可以这样管理它,也许您已经在管理类似的案例。Web 界面将明确显示“地址 1、2、...”,每个都根据其特定类型呈现,每个都带有“-”按钮和最后一个“+”按钮。这将清楚地表明,如果他们想更改其类型,则必须删除/添加联系信息。

一种类似的方法是删除/重新创建联系信息,前提是用户已更改其类型(可能您已经必须呈现新的 Web 表单)。在这种情况下,我认为您无法避免更新与其他人的链接。我会通过建立双向关系来做到这一点,即同时引入Person.getContactInfo() 和ContactInfo.getPersons()。我将在 add()/delete() 方法中管理双向性(即 addContactInfo( ContactInfo c) 应该调用 c.addPerson ( this ),反之亦然,参见这里)并且 Hibernate 应该能够自动更新外键.

于 2013-10-29T11:04:57.273 回答