2011-11-29 46 views
2

我有两个实体,ContractCustomer,其之间限定有双向one-to-一个关系:双向one-to-one关联:休眠取实体两次

在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这是OK我为我准备以后与batch-size属性来优化延迟加载。
  2. 同样的读取与SELECT ... FROM Customer WHERE CONTRACTID=?

Customer对象如何告诉Hibernate使用customer实例,它已经出现在了会议?

编辑: 如果由于CustomerCONTRACTID代替2. Customer的主键取出这是不可能的),这种情况下强加另一N + 1个问题,是吗?

+0

双向一对一建议您只能为客户提供单一合同是否正确? –

+0

是的,那是预期。 – rainer198

回答

0

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

1)改变在所述Contractone-to-one<set...(一到多)与lazy="true"access="field"inverse="false"。该物业被命名为customers代替customer

2)在Java类Contract我公司推出的新customers财产,但没有新的setter和getter(这就是为什么我们需要access="field"

3)改变的消气老单值属性返回customers组的第一元件,当且仅当它不为空,并且具有的尺寸= 1

4)改变旧设定器来初始化一个新的HashSet和添加唯一的customer到它。

这种方式的实体API没有改变,我有幻想,它被映射为一对一;-)。尽管如此,我将不胜感激另一种解决方案