首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

HIBERNATE 中get步骤和load方法的区别

2012-09-09 
HIBERNATE 中get方法和load方法的区别get方法执行顺序:1.首先通过ID在session缓存中查找对象,如果存在此ID

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的其他属性。

热点排行