HIBERNATE 中get方法和load方法的区别
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 >
???????????????
??????????? </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 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的其他属性。