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

Hibernate lazy加载FOR 单端联系关系

2012-10-23 
Hibernate lazy加载FOR 单端关联Hibernate单端关联懒加载策略:即在one-to-one/many-to-one标签上可以

Hibernate lazy加载FOR 单端关联

Hibernate单端关联懒加载策略:即在<one-to-one>/<many-to-one>标签上可以配置懒加载策略。可以取值为:false/proxy/no-proxyfalse:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象proxy:这是hibernate对单端关联的默认懒加载策略,即只有在调用到其关联对象的方法的时候      才真正发出查询语句查询其对象数据,其关联对象是代理类no-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其关联对象不是代理类注意:在class标签上配置的lazy属性不会影响到关联对象!!!

?

如下例以多对一为例:

package com.bjsxt.hibernate;public class Group {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

?

package com.bjsxt.hibernate;import java.util.Date;public class User {private int id;private String name;private Group group;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Group getGroup() {return group;}public void setGroup(Group group) {this.group = group;}}

?

Group.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.bjsxt.hibernate.Group" table="t_group"><id name="id"><generator name="code"><?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.bjsxt.hibernate.User" table="t_user" ><id name="id"><generator column="relatedGroup" /> --><many-to-one name="group" column="relatedGroup"/> </class></hibernate-mapping>

?

生成数据:

package com.bjsxt.hibernate;import org.hibernate.Session;public class InitData {public static void main(String[] args) {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();Group group = new Group();group.setName("java开发组");//将group转换为持久对对象 session.save(group);for (int i = 0; i < 10 ; i++) {User user = new User();user.setName("User_" + i);//建立对象之间的关系user.setGroup(group);//因为group为持久对象,所以可以成功保存session.save(user);}session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}}}

?

?

测试类:

package com.bjsxt.hibernate;import org.hibernate.Session;import junit.framework.TestCase;/** * 所有lazy的属性默认 * @author Administrator * */public class SingleEndTest1 extends TestCase {public void testLoadUser() {Session session = null;try {session = HibernateUtils.getSession();//不会发出查询sqlUser user = (User)session.load(User.class, 2);//会发出一条查询sql,转载数据到UserSystem.out.println("user name=" + user.getName());//不会发出查询sqlGroup group = user.getGroup();//会发出一条查询sql,转载数据到GroupSystem.out.println("related group=" + group.getName());}catch(Exception e) {e.printStackTrace();}finally {}}}

?

?

将<class>标签中的lazy设置为false

package com.bjsxt.hibernate;import org.hibernate.Session;import junit.framework.TestCase;/** * 将<class>标签中的lazy设置为false * @author Administrator * */public class SingleEndTest2 extends TestCase {public void testLoadUser() {Session session = null;try {session = HibernateUtils.getSession();//会发出一条查询sql,转载数据到UserUser user = (User)session.load(User.class, 2);//不会发出查询sqlSystem.out.println("user name=" + user.getName());//不会发出查询sqlGroup group = user.getGroup();//会发出一条查询sql,转载数据到GroupSystem.out.println("related group=" + group.getName());}catch(Exception e) {e.printStackTrace();}finally {}}}

?

?保持<class>标签中的lazy默认设置, 将<many-to-one>标签中加入lazy=false

package com.bjsxt.hibernate;import org.hibernate.Session;import junit.framework.TestCase;/** * 保持<class>标签中的lazy默认设置 * 将<many-to-one>标签中加入lazy=false * @author Administrator * */public class SingleEndTest3 extends TestCase {public void testLoadUser() {Session session = null;try {session = HibernateUtils.getSession();//不会发出一条查询sqlUser user = (User)session.load(User.class, 2);//会发出查询sql,这里因为many-to-one设置了lazy=false所以这里会把group也加载过来,这里会发出两条SQL//Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.relatedGroup as relatedG3_0_0_ from t_user user0_ where user0_.id=?//Hibernate: select group0_.id as id1_0_, group0_.name as name1_0_ from t_group group0_ where group0_.id=?System.out.println("user name=" + user.getName());//不会发出查询sqlGroup group = user.getGroup();//前面一次性查出了数据,不再发出查询SQLSystem.out.println("related group=" + group.getName());}catch(Exception e) {e.printStackTrace();}finally {}}}

?

热点排行