懒加载休眠

时间:2015-05-11 10:28:49

标签: spring hibernate lazy-loading

我使用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模式,以检查我的延迟加载是否正常。不幸的是我不理解他们

  • 当注释掉FIRST或SECOND行时,hibernate只显示一个查询(其中所有一对一关联都作为连接存在),
  • 当FIRST和SECOND两行都被取消注释时,hibernate显示两个查询,一个获取B,第二个获得A实体。

为什么会这样?是因为所有的一对一关联都不能延迟加载,所以它们是作为单独的查询急切加载还是“加入”原始查询?如果是这样,为什么hibernate没有加入A表两次?

0 个答案:

没有答案