session.load()的延迟加载及缓存

1.执行load()时,先从Session查找当前的对象是否存在,如果不存在,则从数据库中去查询,如果不存在这条记录,则扔异常;
/**执行get()的时候,不论Session中是否存在当前对象,直接从数据库中去查询,如果不存在,则返回null。**/

2.当前的对象如果不存在时,那么需要到数据库去查询
当你调用load()方法时,事实上他可能并没有真正的去查询数据库,那么要如何马上让他去查询呢
有两种办法:
第一种是:调用完load方法时把马上使用所加载的对象(看不懂的话先看第二种)
第二种是:只要把相对应的对象的配置文件中的lazy设置为false;
这就是hibernate的延迟加载机制(lazy),如果把lazy设置为false,则不使用延迟加载;如果设置为true则使用延迟加载,只有使用到所加载的对象时才会去查询
例如:
有一个类他的配置文件为:

<hibernate-mapping>
<class name="Events" table="events" catalog="hibernate" lazy="true" >
<id name="eventId" type="java.lang.Integer">
<column name="EVENT_ID" />
<generator class="native" />
</id>
<!-- 其他配置信息 -->
</class>
</hibernate-mapping>



第一次调用load的代码为:

//把hibernate.cfg.xml中添加
//<property name="show_sql">true</property>
//也就是当服务器去操作数据库时输出所对应的sql
Events anEvent = (Events) session.load(Events.class, eventId);
//事实上这个时候输出并没有真正的去查询数据库

//请看一下配置:
//<class name="Events" table="events" catalog="hibernate" lazy="true" >
//所对应的元素的lazy被设置为true了
//你把lazy设置为false,可以发现调用完上面的这行代码时
//马上就输出了所对应的sql
//那当lazy为true时,load()要延迟到什么时候才去加载数据(查询数据库)呢
//调用完load()之后,只要使用了该对象时就会去加载数据(查询数据库)
//也同时会把sql输出来了,例如:System.out.println(anEnvent);


假如上面的的Envents类里面有一个Set集合
代码为:

package hibernate.hibernate.event;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Events implements java.io.Serializable {
// Fields
private Set persons = new HashSet();
// Constructors

/** default constructor */
public Events() {
}

public Set getPersons() {
return persons;
}

public void setPersons(Set persons) {
this.persons = persons;
}

}

所对应的配置为

<hibernate-mapping>
<class name="hibernate.hibernate.event.Events" table="events" catalog="hibernate" lazy="false" >
<id name="eventId" type="java.lang.Integer">
<column name="EVENT_ID" />
<generator class="native" />
</id>
<!--其他配置信息-->
<set name="persons" table="person_event" catalog="hibernate" inverse="true" lazy="false">
<key column="EVENT_ID"></key>
<many-to-many column="PERSON_ID" class="hibernate.hibernate.person.Person"></many-to-many>
</set>
</class>
</hibernate-mapping>

//此时如何不调用EventsObj.getPersons();
//或者不使用persons这个集合的属性
//session.load(anEvent);也是不会加载persons这个集合的
//请看配置<set name="persons" table="person_event" catalog="hibernate" inverse="true" lazy="false">
//其中的lazy也是为false,所以将设置为true将不会延迟加载
//或者马上就使用这个集合
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值