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 {}}}?