fetch="join" 和 fetch="select" 没有区别?

在hibernate3里面多了 fetch的选项,文档里面说得很简单,我知道lazy参数才是决定是否在查询主表的时候去查询子表,但是这个 fetch又起什么作用呢?我测试了一下,发现无论是 fetch="join" 还是 fetch="select",hibernate向数据库发送的 SQL都是一样的。 以一个简单的一对多做例子:
Many 一端


代码
<hibernate-mapping>
<class name="lyo.test.hibernate.bean.PostThread" table="thread" catalog="testrails">
<id name=
"id" type="java.lang.Integer">
<column name=
"id" />
<generator class=
"native" />
</id>
<many-to-one name=
"developer" class="lyo.test.hibernate.bean.Developer"
lazy=
"false" fetch="join">
<column name=
"developer_id">
<comment></comment>
</column>
</many-to-one>
</class>
</hibernate-mapping>


One 一端:

代码
<hibernate-mapping>
<class name="lyo.test.hibernate.bean.Developer" table="developer" catalog="testrails">
<id name=
"id" type="java.lang.Integer">
<column name=
"id" />
<generator class=
"native" />
</id>
<set name=
"threads" inverse="true" cascade="all">
<key>
<column name=
"developer_id">
<comment></comment>
</column>
</key>
<one-to-many class=
"lyo.test.hibernate.bean.PostThread" />
</set>
</class>
</hibernate-mapping>

测试查询语句:


代码
List list=session.createQuery("from PostThread").list();


发现 hibernate向数据库发送的语句都是:

代码
07:45:11,471 DEBUG org.hibernate.hql.ast.QueryTranslatorImpl.generate:217 - SQL: select postthread0_.id as id0_, postthread0_.developer_id as developer10_0_ from testrails.thread postthread0_


怎么会没有区别呢? 文档上好像说 join的方式效率高一些,但是是否取子表的数据不是由 lazy参数决定的么,和 fetch 参数有什么关系?

Fetching 策略用来决定如何读取那些关联子对象。

在配置中使用fetch=“join” ,Hibernate将在同一个select中返回关联子对象或集合,能够利用Oracle 或 Sybase类型outer joins能够提高性能

fetch=“select” ,这表示Hibernate将在第二个SELECT中获取关联方实体或集合,除非你显式地实现lazy fetching (lazy=“false”)。

简单说:join是一条SQL完成, select是分两次SQL完成.