`

Hibernate lazy加载FOR 单端关联

阅读更多
Hibernate单端关联懒加载策略:即在<one-to-one>/<many-to-one>标签上可以配置
懒加载策略。

可以取值为:false/proxy/no-proxy
false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象
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 class="native"/>
		</id>
		<property name="name"/>
	</class>
</hibernate-mapping>	

 

User.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.User" table="t_user" >
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!--
		<many-to-one name="group" 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();
			
			//不会发出查询sql
			User user = (User)session.load(User.class, 2);
			
			//会发出一条查询sql,转载数据到User
			System.out.println("user name=" + user.getName());
			
			//不会发出查询sql
			Group group = user.getGroup();
			
			//会发出一条查询sql,转载数据到Group
			System.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,转载数据到User
			User user = (User)session.load(User.class, 2);
			
			//不会发出查询sql
			System.out.println("user name=" + user.getName());
			
			//不会发出查询sql
			Group group = user.getGroup();
			
			//会发出一条查询sql,转载数据到Group
			System.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();
			
			//不会发出一条查询sql
			User 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());
			
			//不会发出查询sql
			Group group = user.getGroup();
			
			//前面一次性查出了数据,不再发出查询SQL
			System.out.println("related group=" + group.getName());
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			
		}
	}
}

 

分享到:
评论

相关推荐

    hibernate在单端关联上的lazy策略

    在压缩包文件“hibernate_lazy_for_single_end”中,可能包含了一些示例代码或测试用例,帮助读者理解并实践Hibernate的单端关联懒加载策略。这些文件可能包括实体类、映射文件、测试类等,通过实际操作展示如何配置...

    Hibernate延迟加载

    4. 单端关联(One-to-one, many-to-one)的延迟加载:`&lt;one-to-one&gt;`和`&lt;many-to-one&gt;`元素的`lazy="proxy"`、`lazy="false"`或`lazy="noproxy"`可以控制关联对象的延迟加载行为。`lazy="proxy"`会在访问关联对象时...

    hibernate源码

    `hibernate_lazy_for_single_end`可能涉及到了Hibernate的单端延迟加载。延迟加载是指关联对象在首次访问时才进行加载,而单端加载则是指只在一个方向上启用延迟加载,通常用于优化性能,避免不必要的数据库访问。 ...

    Hibernate关联关系疑问

    5. **懒加载与急加载(Lazy Loading vs Eager Loading)**:Hibernate提供了两种加载关联对象的方式。懒加载默认不加载关联对象,只有在真正需要时才查询数据库;而急加载则会在加载主体对象时一起加载关联对象。...

    Hibernate延迟加载原理与实现方法

    取消延迟加载可以通过在映射文件中设置`lazy="false"`,例如对于集合属性和单端关联的实体。 3. 抓取策略(Fetch策略): - 对于单端关联(`&lt;many-to-one&gt;`, `&lt;one-to-one&gt;`),可以使用`fetch`属性控制加载方式...

    HIBERNATE检索策略

    这是HIBERNATE默认的抓取策略,当一个实体被加载时,与之关联的实体或集合并不会立即加载,而是采用延迟加载(Lazy Loading)的方式。当第一次访问关联实体或集合时,HIBERNATE会额外发送一条SELECT语句来抓取数据,...

    hibernate结构框架及组要实现类的深入分析

    在类级别上,如果设置 `lazy=false`,则在查询时会自动加载关联的对象;而在属性级别上,它控制单个属性的加载行为。 **级联操作(Cascade)** 级联操作定义了对一个实体的操作如何影响与其关联的实体。常见的级联...

    Hibernate+中文文档

    19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using ...

    hibernate实例(一对多,多对一)

    此外,还可以设置`fetch`策略(如LAZY或EAGER)来控制何时加载关联的集合。 **配置示例** 在Hibernate中,配置一对一和一对多关联通常涉及以下步骤: 1. 定义实体类:为每个数据库表创建对应的Java类,并添加属性...

    hibernate3.2中文文档(chm格式)

    19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using ...

    HibernateAPI中文版.chm

    19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using ...

    Hibernate中文详细学习文档

    19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using ...

    SSH延迟加载的一个小DEMO

    SSH延迟加载(Lazy Loading)是Java开发中Spring、Struts和Hibernate这三大框架结合使用时,Hibernate提供的一种优化数据加载的策略。它允许我们在需要的时候才加载关联的对象或集合,而不是在初始加载实体时就一并...

    Hibernate教程

    20.1.3. 单端关联代理(Single-ended association proxies) 20.1.4. 实例化集合和代理(Initializing collections and proxies) 20.1.5. 使用批量抓取(Using batch fetching) 20.1.6. 使用子查询抓取(Using ...

    hibernate 体系结构与配置 参考文档(html)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate 中文 html 帮助文档

    19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using ...

    hibernate3.04中文文档.chm

    20.1.3. 单端关联代理(Single-ended association proxies) 20.1.4. 实例化集合和代理(Initializing collections and proxies) 20.1.5. 使用批量抓取(Using batch fetching) 20.1.6. 使用子查询抓取...

    ejb3-persistence.jar hibernate-annotations.jar

    Hibernate-Annotations还包含了一些其他高级特性,如懒加载(Lazy Loading)、级联操作(Cascading)、事务管理等。懒加载允许只在真正需要时才加载关联的对象,从而优化性能。级联操作则允许在对一个对象进行操作...

    hibernate 框架详解

    目录 前言 1.... 2.... 1. 在Tomcat中快速上手 ... 1.1. 开始Hibernate之旅 1.2.... 1.3.... 1.4.... 1.5....2. Hibernate入门 ... 2.1.... 2.2. 第一部分 - 第一个Hibernate程序 ... 单端关联代理(Single-ended association proxies) ...

Global site tag (gtag.js) - Google Analytics