我有两个实体,Contract
和Customer
,它们之间定义了一个双向的一对一关系:
:
....
<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
属性的延迟获取。 再次用
SELECT ... FROM Customer WHERE CONTRACTID=?
获取Customer
对象如何告诉Hibernate使用已经存在于会话中的customer
实例?
如果这是不可能的,因为Customer
是由CONTRACTID
获取的,而不是Customer
的主键在2.)中,这种情况会带来另一个N+1问题,对吗?
我决定使用以下解决方案:
1)将Contract
中的one-to-one
与lazy="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没有改变,我有一种错觉,它被映射为一对一;-)。尽管如此,我还是希望有其他解决方案