使用xml休眠从一个表到多个表的一对一关系
Posted
技术标签:
【中文标题】使用xml休眠从一个表到多个表的一对一关系【英文标题】:Hibernate one to one relationship from a table to multiple tables using xml 【发布时间】:2015-08-24 09:59:46 【问题描述】:我正在使用 hibernate,从一个表到多个不同的表的一对一映射。
我有 3 张桌子 Customer
、NormalCustomer
、PreviligedCustomer
。
CstId
是Customer
表中的主键,是NormalCustomer
、PreviligedCustomer
表中的主键和外键。我有一个 sql,它在这三个表上进行左外连接,以从三个表中获取不同的列值。
问题:第一次,NormalCustomer
/PreviligedCustomer
表是空的。这 2 个表将由其他进程更新。在对 Customer
obj 进行一些 udpate 并保存后,创建一个新行 NormalCustomer
和 PreviligedCustomer
与 CstId
的 Customer
相同。
注意:对于Customer
表中的特定CstId
,存在一行或多行
必需的解决方案:我不希望在NormalCustomer
/PreviligedCustomer
表中保留一行,除非NormalCustomer
/PreviligedCustomer
中存在来自Customer
的CstId
的行。
映射: 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<one-to-one name="Customer" class="com.test.Customer" constrained="true" />
PreviligedCustomer.hbm.xml<one-to-one name="Customer" class="com.test.Customer" constrained="true" />
【问题讨论】:
【参考方案1】:认为有几种方法可以解决这个问题:
您可以有条件地(手动)保存它们,而不是使用“cascade=SAVE-UPDATE”。
在这种情况下,您将首先保存客户实体并重新查询。 该查询将检索现有的 NormalCustomer/PrevilegedCustomer 记录(如果有)(例如,如果其他进程插入,Customer.getNormalCustomer 将显示记录)。 根据需要更新子对象您可以继续使用 SAVE-UPDATE 但在初始保存客户实体后检查您想要的条件。如果不满足,则从 NormalCustomer/PrevilegedCustomer 中删除新记录。
【讨论】:
是的,我同意你的看法。如果记录数量较少,这不会有任何问题。但是,这会增加数据库命中的数量,这与记录的数量成正比。请有任何建议 您还可以在客户表中添加一个标志来指示是否填充了普通客户或特权客户。使用此标志有条件地保存依赖客户对象 我在客户表中有一个列来表示它是普通客户还是特权客户,但普通/特权表中没有列来表示除了 id 列之外哪个表是普通/特权以上是关于使用xml休眠从一个表到多个表的一对一关系的主要内容,如果未能解决你的问题,请参考以下文章