get方法执行顺序:
1.首先通过ID在session缓存中查找对象,如果存在此ID对象,那么就直接返回。
2.在二级缓存中查找,找到后返回。
3.如果都找不到,则从数据库加载拥有此ID 的对象。
4.get方法不管配置文件中设置的lazy为何值,都采用的是立即检索对象。
load方法和get方法的不同:
1.立即检索
team的配置文件:(设置lazy="false")
<class name="com.vo.Team" table="team" catalog="test" lazy="false">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" >
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="Name" />
</property>
<set name="students" inverse="true" cascade="all" lazy="true" batch-size="2">
<key column="teamID"></key>
<one-to-many class="com.vo.Student"></one-to-many>
</set>
</class>
如果对象存在两方法是一样的。
如果对象不存在get方法和load方法的区别:
Session session = SessionUtil.getSession();
Transaction tran = session.beginTransaction();
Team team =(Team)session.get(Team.class, 56);
if(team==null)
{
System.out.println("team 对象为空!");
}
tran.commit();
session.close();
打印:
对于GET方法:team 对象为空!
对于LOAD方法:Exception in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.vo.Team#56]
抛出异常。
2.延迟检索
get方式仍然采用立即加载。
load方式只是返回一个带有ID属性的对象,并没有组装该对象其他属性,当用到该用户其他属性的时候,才会发送SQL语句Session session = SessionUtil.getSession();
Transaction tran = session.beginTransaction();
Team team =(Team)session.load(Team.class, 2);
if(team==null)
{
System.out.println("team 对象为空!");
}
System.out.println(team.getId());//1处
//System.out.println(team.getName());//2处
tran.commit();
session.close();去组装该对象的其他实例。
注释:当采用延迟加载,如果只执行1处的代码,是直接将返回2,是不会发送SQL语句的。当打印2处的代码才会发送SQL语句。
load方式采用延迟加载是返回对象的代理对象,并没有组装除了ID的其他属性。