双向一对一关联:Hibernate两次获取实体

时间:2011-11-29 11:16:19

标签: hibernate hibernate-mapping

我有两个实体,ContractCustomer之间定义了双向一对一关系:

在Customer.hbm.xml中:

....   
<many-to-one name="contract" class="Contract" fetch="select">
    <column name="CONTRACTID" not-null="true" unique="true" />
</many-to-one>

在Contract.hbm.xml中:

...
<one-to-one name="customer" class="Customer" property-ref="contract" />

当迭代集合Customer实体(在某些HQL查询中获取)和每个customer访问contract字段时,Hibernate会为每个“客户”执行两个额外的语句:

  1. contract的懒惰提取对我来说没问题,因为我稍后会使用batch-size属性优化延迟提取。
  2. 再次使用Customer
  3. 获取SELECT ... FROM Customer WHERE CONTRACTID=?对象

    如何告诉Hibernate使用会话中已存在的customer实例?

    修改 如果这是不可能的,因为Customer是由CONTRACTID而不是Customer在2中的主键提取的。),这种情况会产生另一个N + 1问题,对吗?

1 个答案:

答案 0 :(得分:0)

我决定使用以下解决方法:

1)使用one-to-oneContract<set...lazy="true"中的access="field"更改为inverse="false"(一对多) 。该属性的名称为customers,而不是customer

2)在java类Contract中我引入了新的customers属性,但没有新的setter和getter(这就是我们需要access="field"的原因。

3)更改旧单值属性的getter以返回customers集的第一个元素,当且仅当它不为null且size = 1时才会返回

4)更改旧的setter以初始化一个新的HashSet并仅向其添加customer

这样实体API没有改变,我有一种错觉,它被映射为一对一;-)。不过,我会很感激另一种解决方案