使用xml休眠从一个表到多个表的一对一关系

Posted

技术标签:

【中文标题】使用xml休眠从一个表到多个表的一对一关系【英文标题】:Hibernate one to one relationship from a table to multiple tables using xml 【发布时间】:2015-08-24 09:59:46 【问题描述】:

我正在使用 hibernate,从一个表到多个不同的表的一对一映射。

我有 3 张桌子 CustomerNormalCustomerPreviligedCustomer

CstIdCustomer表中的主键,是NormalCustomerPreviligedCustomer表中的主键和外键。我有一个 sql,它在这三个表上进行左外连接,以从三个表中获取不同的列值。

问题:第一次,NormalCustomer/PreviligedCustomer 表是空的。这 2 个表将由其他进程更新。在对 Customer obj 进行一些 udpate 并保存后,创建一个新行 NormalCustomerPreviligedCustomerCstIdCustomer 相同。

注意:对于Customer 表中的特定CstId,存在一行或多行

必需的解决方案:我不希望在NormalCustomer/PreviligedCustomer 表中保留一行,除非NormalCustomer/PreviligedCustomer 中存在来自CustomerCstId 的行。

映射: Customer.hbm.xml

<one-to-one name="NormalCustomer" class="com.test.NormalCustomer" cascade="save-update, merge"/> <one-to-one name="PreviligedCustomer" class="com.test.PreviligedCustomer" lazy="false" fetch="join" cascade="save-update, merge"/>

NormalCustomer.hbm.xml&lt;one-to-one name="Customer" class="com.test.Customer" constrained="true" /&gt;

PreviligedCustomer.hbm.xml&lt;one-to-one name="Customer" class="com.test.Customer" constrained="true" /&gt;

【问题讨论】:

【参考方案1】:

认为有几种方法可以解决这个问题:

    您可以有条件地(手动)保存它们,而不是使用“cascade=SAVE-UPDATE”。

    在这种情况下,您将首先保存客户实体并重新查询。 该查询将检索现有的 NormalCustomer/PrevilegedCustomer 记录(如果有)(例如,如果其他进程插入,Customer.getNormalCustomer 将显示记录)。 根据需要更新子对象

    您可以继续使用 SAVE-UPDATE 但在初始保存客户实体后检查您想要的条件。如果不满足,则从 NormalCustomer/PrevilegedCustomer 中删除新记录。

【讨论】:

是的,我同意你的看法。如果记录数量较少,这不会有任何问题。但是,这会增加数据库命中的数量,这与记录的数量成正比。请有任何建议 您还可以在客户表中添加一个标志来指示是否填充了普通客户或特权客户。使用此标志有条件地保存依赖客户对象 我在客户表中有一个列来表示它是普通客户还是特权客户,但普通/特权表中没有列来表示除了 id 列之外哪个表是普通/特权

以上是关于使用xml休眠从一个表到多个表的一对一关系的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Fluent API 配置从 AspNetUsers 表到...的一对多关系

一对多的连接列为空休眠

如何确保休眠 5 在与共享主键的一对一关系中保持正确的顺序

如何在 EF 中创建从两个表到一个源的一对一映射?

EF简易教程,从建表到表间关系

sqlalchemy:与多个表的非平凡的一对一关系