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



我有两个实体,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. 再次用SELECT ... FROM Customer WHERE CONTRACTID=? 获取Customer对象

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

编辑:

如果这是不可能的,因为Customer是由CONTRACTID获取的,而不是Customer的主键在2.)中,这种情况会带来另一个N+1问题,对吗?

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

1)将Contract中的one-to-onelazy="true"access="field"inverse="false"修改为<set...(一对多)。属性被命名为customers而不是customer

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

3)将旧的单值属性的getter更改为返回customers集合的第一个元素,当且仅当它不为空且size=1

4)将旧的setter初始化一个新的HashSet,并将唯一的customer添加到其中。

这样,实体API没有改变,我有一种错觉,它被映射为一对一;-)。尽管如此,我还是希望有其他解决方案

最新更新