Hibernate 从一个子类更改为另一个子类的最智能方法(更新鉴别器值)

Hibernate 从一个子类更改为另一个子类的最智能方法(更新鉴别器值),hibernate,hierarchy,discriminator,table-per-hierarchy,Hibernate,Hierarchy,Discriminator,Table Per Hierarchy,背景:我正在为以下类实现持久性: class-Person 抽象类联系人信息 电子邮件扩展了ContactInfo SnailMail扩展了ContactInfo 每个人都有一个对联系人信息对象的引用。(并且一个联系人信息对象可以在多个人之间共享) 在我的用户界面中,我需要让用户编辑联系人信息对象,并可能将电子邮件地址替换为蜗牛邮件地址。(如果要替换的联系人信息对象在多人之间共享,则所有这些人都应更新其联系人信息。) 然而,据我所知,Hibernate拒绝更新discriminator列

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

  • class-Person

  • 抽象类联系人信息

    • 电子邮件扩展了ContactInfo
    • SnailMail扩展了ContactInfo
每个人都有一个对联系人信息对象的引用。(并且一个联系人信息对象可以在多个之间共享)

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

然而,据我所知,Hibernate拒绝更新discriminator列,因此只需创建一个新的SnailMail对象,将要替换的Email对象的主键值赋予它,保存它就不起作用了

问题:允许用户将联系人信息对象从电子邮件更改为电子邮件的最佳方式是什么

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

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


如果(B)是解决方法,我可以使用一些HQL语句来更新引用,还是应该“手动”加载/更新/保存所有受影响的person对象?

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

您确定此人不需要多个联系人信息吗?如果关系有很多,你可以这样处理,也许你已经在处理类似的案例了。web界面将显式显示“地址1,2,…”,每个地址根据其特定类型呈现,每个地址的末尾都有“-”按钮和“+”按钮。这将清楚地表明,如果他们想更改联系人信息的类型,他们必须删除/添加联系人信息

类似的方法是删除/重新创建联系人信息,仅当用户更改了其类型时(可能您已经需要呈现新的web表单)。我认为在这种情况下,你无法避免更新与其他人的链接。我将通过使关系具有双向性来实现这一点,即引入Person.getContactInfo()和ContactInfo.getPersons()。我将管理add()/delete()方法中的双向性(即addContactInfo(ContactInfo c)应调用c.addPerson(此),反之亦然,请参见),Hibernate应能够自动更新外键