one-to-many的懒加载及原理分析

如果是一对多,多对一,甚至是多对多那效率就差别大了!!如果一对多lazy=”false”或者fetch=”join”会同时查询出所有关联的对象,对数据库和对网络影响将是很大地。(lazy=”false” 采用多条查询语句,比如,一对100:会有可能101条select查询语句;fetch=”join” 会同时访问两个表的)

但是代理对象调用getClass()和getId()方法的时候不会立刻加载,.class和id的信息是随对象的!


domain对象
public class User {

private Integer id;
private String name;
private Float wage;
private Set<Book> bookSet = new HashSet<Book>();


public class Book {

private Integer id;
private String bookname;
private User user;


映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.hibernate.lazyOneToOne">

<class name="User" table="user" lazy="false">
<id name="id" unsaved-value="-1">
<generator class="native" />
</id>
<property name="name" />
<property name="wage"/>
<set name="bookSet" lazy="false" fetch="select">
<key column="u_id"/>
<one-to-many class="Book"/>
</set>

</class>
</hibernate-mapping>


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.hibernate.lazyOneToOne">

<class name="Book" table="book">
<id name="id" unsaved-value="-1">
<generator class="native" />
</id>
<property name="bookname" />

<many-to-one name="user" column="u_id"/>

</class>
</hibernate-mapping>



测试代码:

User user = (User)session.get(User.class, 1);


此时的sql语句为:
Hibernate: 
select
user0_.id as id0_0_,
user0_.name as name0_0_,
user0_.wage as wage0_0_
from
user user0_
where
user0_.id=?
Hibernate:
select
bookset0_.u_id as u3_1_,
bookset0_.id as id1_,
bookset0_.id as id1_0_,
bookset0_.bookname as bookname1_0_,
bookset0_.u_id as u3_1_0_
from
book bookset0_
where
bookset0_.u_id=?


如果映射文件改为:

<set name="bookSet"  lazy="false" fetch="join">
<key column="u_id"/>
<one-to-many class="Book"/>
</set>


sql语句为:

Hibernate: 
select
user0_.id as id0_1_,
user0_.name as name0_1_,
user0_.wage as wage0_1_,
bookset1_.u_id as u3_3_,
bookset1_.id as id3_,
bookset1_.id as id1_0_,
bookset1_.bookname as bookname1_0_,
bookset1_.u_id as u3_1_0_
from
user user0_
left outer join
book bookset1_
on user0_.id=bookset1_.u_id
where
user0_.id=?


如果映射文件为:

		<set name="bookSet"  lazy="true">
<key column="u_id"/>
<one-to-many class="Book"/>
</set>



只是访问一个表了:
Hibernate: 
select
user0_.id as id0_0_,
user0_.name as name0_0_,
user0_.wage as wage0_0_
from
user user0_
where
user0_.id=?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值