最近,我维护了一个遗留项目,它使用了hibernate 3.3.2 ga
。现在我正在开发一个新的需求库--这个项目,即实现一个连接查询,例如,有一个foo
实体和一个bar
实体,它们之间的关系是一对一的:
Foo:
Integer id; //primary key
String orderSeq; //unique key
//others
Bar:
String orderSeq; //primary key refer Foo's orderSeq
//others
Foo.hbm.xml:
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="orderSeq" type="java.lang.String">
<column name="order_seq" length="40" not-null="true" unique="true">
</column>
</property>
<one-to-one name="bar" class="com.foo.Bar" lazy="no-proxy">
<formula>order_seq</formula>
</one-to-one>
Bar.hbm.xml:
<id name="orderSeq" type="java.lang.String">
<column name="order_seq" length="40">
</column>
</id>
<one-to-one name="foo" class="com.foo.Foo" property-ref="orderSeq" lazy="no-proxy">
</one-to-one>
参见上面的配置,我显式地设置了lazy="no-proxy"
,在正式文件中我知道:
Lazy=“no”指定,当首次访问实例变量时,应该延迟获取该属性。
现在,当我执行以下单元测试时:
@Test
public void test_query_us_order(){
Query query = session.createQuery("from Foo a where a.orderSeq = '151207173519268'");
query.list();
}
我只期望执行一条SQL语句(select ... from foo where foo0_.order_seq = 151207173519268
),但实际上还有两条SQL语句,例如:
select ...
from
bar bar0_
left outer join
foo foo1_
on bar0_.order_seq=foo1_.order_seq
left outer join
bar bar2_
on foo1_.order_seq=bar2_.order_seq
where
bar0_.order_seq=?
select ...
from
foo foo0_
left outer join
bar bar1_
on foo0_.order_seq=bar1_.order_seq
left outer join
foo bar2_
on bar1_.order_seq=bar2_.order_seq
where
foo0_.order_seq=?
为什么是这样?为什么lazy="no-proxy"
配置不能工作?
发布于 2015-12-21 10:33:38
您在问题中引用的文档对lazy
的定义是:
lazy
(可选-默认为proxy
):默认情况下,单点关联被代理。lazy="no-proxy"
指定,当首次访问实例变量时,应该延迟获取该属性。,它需要构建时字节码的检测。lazy="false"
指定关联将总是被急切地获取。
注意no-proxy
需要字节码检测的句子。这是因为没有它,Hibernate将不知道何时访问应用程序中的属性。通过修改应用程序生成的字节码,您基本上注入了在访问属性时执行延迟加载的代码。
如果您不使用字节码插装,您应该简单地使用代理来延迟加载,这意味着您应该将关联定义为:
lazy="proxy"
https://stackoverflow.com/questions/34368895
复制