我有两个实体,Contract
和Customer
之间定义了双向一对一关系:
在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会为每个“客户”执行两个额外的语句:
contract
的懒惰提取对我来说没问题,因为我稍后会使用batch-size
属性优化延迟提取。Customer
SELECT ... FROM Customer WHERE CONTRACTID=?
对象
醇>
如何告诉Hibernate使用会话中已存在的customer
实例?
修改
如果这是不可能的,因为Customer
是由CONTRACTID
而不是Customer
在2中的主键提取的。),这种情况会产生另一个N + 1问题,对吗?
答案 0 :(得分:0)
我决定使用以下解决方法:
1)使用one-to-one
,Contract
和<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没有改变,我有一种错觉,它被映射为一对一;-)。不过,我会很感激另一种解决方案