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> <p>
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> <p>
测试查询语句:
代码 List list=session.createQuery("from PostThread").list(); <p>
发现 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_ <p>
怎么会没有区别呢? 文档上好像说 join的方式效率高一些,但是是否取子表的数据不是由 lazy参数决定的么,和 fetch 参数有什么关系?
在配置中使用fetch=“join” ,Hibernate将在同一个select中返回关联子对象或集合,能够利用Oracle 或 Sybase类型outer joins能够提高性能
fetch=“select” ,这表示Hibernate将在第二个SELECT中获取关联方实体或集合,除非你显式地实现lazy fetching (lazy=“false”)。
简单说:join是一条SQL完成, select是分两次SQL完成.
猜你喜欢
本站原创《复杂软件设计之道:领域驱动设计全面解析与实战》