1.执行load()时,先从Session查找当前的对象是否存在,如果不存在,则从数据库中去查询,如果不存在这条记录,则扔异常;
/**执行get()的时候,不论Session中是否存在当前对象,直接从数据库中去查询,如果不存在,则返回null。**/
2.当前的对象如果不存在时,那么需要到数据库去查询
当你调用load()方法时,事实上他可能并没有真正的去查询数据库,那么要如何马上让他去查询呢
有两种办法:
第一种是:调用完load方法时把马上使用所加载的对象(看不懂的话先看第二种)
第二种是:只要把相对应的对象的配置文件中的lazy设置为false;
这就是hibernate的延迟加载机制(lazy),如果把lazy设置为false,则不使用延迟加载;如果设置为true则使用延迟加载,只有使用到所加载的对象时才会去查询
例如:
有一个类他的配置文件为:
第一次调用load的代码为:
假如上面的的Envents类里面有一个Set集合
代码为:
所对应的配置为
//此时如何不调用EventsObj.getPersons();
//或者不使用persons这个集合的属性
//session.load(anEvent);也是不会加载persons这个集合的
//请看配置<set name="persons" table="person_event" catalog="hibernate" inverse="true" lazy="false">
//其中的lazy也是为false,所以将设置为true将不会延迟加载
//或者马上就使用这个集合
/**执行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将不会延迟加载
//或者马上就使用这个集合