写程序,做产品,过日子

成功其实很简单,就是强迫自己坚持下去

BlogJava 首页 新随笔 联系 聚合 管理
  69 Posts :: 1 Stories :: 92 Comments :: 0 Trackbacks

一直以为,在Hiberenate中用多对一关系表达外键,并设置为延迟加载时,Hibernate不会在查主表时去查引用表。今天的测试却发现不是这么回事。

我定义了一个Topic类,其中有一个外键引用Company类:

 

< many-to-one  name ="company"  class ="Company"  lazy ="no-proxy" >
< column  name ="COMPANY"  length ="32"   />
</ many-to-one >

 

测试HQL如下:select id, company from Topic

而我期望的SQL应当是这样:select boid, company from DT_TOPIC.

结果Hiberate Tools 生成的SQL是这样:

 

select
topic0_.BOID 
as  col_0_0_,
topic0_.COMPANY 
as  col_1_0_,
company1_.COMPID 
as  COMPID409_,
company1_.COMPNAME 
as  COMPNAME409_,
company1_.DESCRIPTION 
as  DESCRIPT3_409_,
company1_.STATUS 
as  STATUS409_ 
from
DT_TOPIC topic0_ 
inner   join
XPC_COMPANY company1_ 
on  topic0_.COMPANY = company1_.COMPID

 

Hibernate生成的SQL多做了两件影响性能的事情:

1, 与XPC_COMPANY进行inner join。

2,把XPC_COMPANY中的所有字段全取出来了。

这样还叫什么延迟加载啊?

 

哪位高手能告诉我这是为什么?

posted on 2007-01-17 21:54 Welkin Hu 阅读(3017) 评论(4)  编辑  收藏 所属分类: Java

Feedback

# re: Hibernate的多对一关系是如何延迟加载的? 2007-01-18 09:59 小雪飞刀
当然不会延迟了!
您的lazy ="no-proxy"
<many-to-one>默认的属性是lazy="proxy",此时默认是会延迟加载的。而在指定了lazy="true"之后,必须要经过运行期字节码增加,延迟加载才有效果。  回复  更多评论
  

# re: Hibernate的多对一关系是如何延迟加载的? 2007-01-18 10:06 小雪飞刀
而对于<one-to-one>的情况,延迟加载还要受到constrained属性的影响。如果当constrained="true",lazy="proxy"(默认),是可以延迟加载的。因为constrained="false"时表明实体和被关联到的实体的约束不是强制的,这时在查询实体时,Hibernate总会检查<one-to-one>所关联的实体是否存在,就把one-to-one关联的实体查询出来了,所以constrained需要设为"true"。
  回复  更多评论
  

# re: Hibernate的多对一关系是如何延迟加载的? 2007-01-18 10:35 Welkin Hu
我用的是Hibernate 3.2.1,在Many-to-one中的Lazy只能取proxy, no-proxy, false,没有true。
上面三种Lazy方法我都试过,结果是一样的。
在Hibernate3.2.1参考文档中是这样解释的。
lazy (optional - defaults to proxy): By default, single point associations are proxied. lazy="no-proxy"
specifies that the property should be fetched lazily when the instance variable is first accessed (requires
build-time bytecode instrumentation). lazy="false" specifies that the association will always be eagerly
fetched.
按这个解释,no-proxy也是延迟加载啊。  回复  更多评论
  

# re: Hibernate的多对一关系是如何延迟加载的? 2007-01-22 09:19 Welkin Hu
前天按Hibernate 3.2.1 reference book,玩通了上面说的build-time bytecode instrumentation,并且设置lazy="proxy",引用表端也设置了lazy="true",最终生成的SQL还是老样子!
只有两种情况在例外,无论做不做instrumentation:
1,只有from,没有select子句。
2, 使用select company.id代替select company。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: