我使用Spring 3和hibernate 3.6.3.Final。我必须使用实体A和B.hbm文件是:
A.hbm.xml
<hibernate-mapping>
<class name="com.A" table="A" >
<id name="A_Id" type="string">
<column name="Id" length="100" />
<generator class="foreign">
<param name="property">B</param>
</generator>
</id>
<one-to-one name="B" class="B" constrained="true" fetch="select" ></one-to-one>
<property>...</property>
</class>
</hibernate-mapping>
和B.hbm.xml
<hibernate-mapping>
<class name="com.B" table="B">
<id name="B_Id" type="string">
<column name="Id" length="32" />
<generator class="assigned" />
</id>
...
<one-to-one name="some_A" class="com.A" lazy="proxy"></one-to-one> // FIRST
<one-to-one name="other_A" class="com.A" lazy="proxy" cascade="all" > // SECOND
<formula>other_BSRC_REG_REP_MESSAGE_ID</formula>
</one-to-one>
</class>
</hibernate-mapping>
从@Service我使用以下代码通过id获取实体B:
getHibernateTemplate().get(getEntityClass(), id)
我在hibernate中启用了show_sql模式,以检查我的延迟加载是否正常。不幸的是我不理解他们
为什么会这样?是因为所有的一对一关联都不能延迟加载,所以它们是作为单独的查询急切加载还是“加入”原始查询?如果是这样,为什么hibernate没有加入A表两次?