`

十八 一对一对象的懒加载

 
阅读更多
一对一对象的懒加载,对于主的一方,lazy是无效的,它在访问数据的时候,还是会利用左连接,把主从表的数据
全部查询一遍 但是对于从对象,默认的是懒加载 lazy=true 如果你需要从对象的数据,如果你通过子实体和id直接去查询
从实体 get()方法 它只查询从对象的数据,并不会去查询主对象的数据


一对多 懒加载 重点
缺省的是懒加载的 比说说部门与员工 ,一个部门可能有几千员工 

比说我我们增加一个部门 同时增加几名员工  我们查询部门的信息 
package vo.util.test;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.Transaction;

import vo.util.HibernateUtil;
import vo.util.bean.Department;
import vo.util.bean.Employee;

public class OneToMany {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	
         add();
        query(1);
	}
    static Department add(){
    	Session session = null;
    	Transaction tx = null;
    	try{
    		session =HibernateUtil.getSession();
    		tx = session.beginTransaction();
    		//…你的代码save,delete,update,get…
    		Department dpart=new Department();
    		dpart.setName("政企事业部");
    		
    		Employee em1=new Employee();
    		em1.setName("员工李小仙");
    		em1.setDerpartment(dpart);
    		
    		Employee em2=new Employee();
    		em2.setName("员工张小三");
    		em2.setDerpartment(dpart);
    		
    		Map<String,Employee> ems=new HashMap<String, Employee>();
    	    ems.put(em1.getName(), em1);
    	    ems.put(em2.getName(), em2);
    	    
    	    dpart.setEms(ems);    
    		session.save(dpart);
    		session.save(em1);
    		session.save(em2);
    		
    		
    		tx.commit();
    		return dpart;
    	}finally{
    		if(session != null)session.close();
    	} 

    }
    
    static Department query(int id){
    	Session session=null;
    	
    	try{
    	   session=HibernateUtil.getSession();
	   //这里只是调用部门的实体类进行查询 
    	   Department d=(Department)session.get(Department.class, id);
    	   
    	   //System.out.println(d.getEms());
    	  
    		return d;
    	}finally{
    		if(session != null)session.close();
    	} 

    }
}


控制台输出 
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
打开连接成功!Hibernate: insert into Department (name) values (?)
Hibernate: insert into Employee (name, depaer_id) values (?, ?)
Hibernate: insert into Employee (name, depaer_id) values (?, ?)
Hibernate: update Employee set depaer_id=?, name=? where id=?
Hibernate: update Employee set depaer_id=?, name=? where id=?
Hibernate: select department0_.id as id0_0_, department0_.name as name0_0_ from Department department0_ where department0_.id=?


发现 只是查询了部门的信息 并没有去查询员工的信息 说明默认的情况下 一对多 一的一方是懒加载的

然后我们看部门的映射文件
<?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 
	package="vo.util.bean">

	<class name="Department">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!-- 配置一对多的映射关系  -->
		<!-- 
		<set name="ems">
		 -->
		<!-- 关联关系的外键  -->
		<!--  
		<key column="depaer_id"/>
		-->
		   <!-- 关联关系的实体类配置 -->
		   <!-- 
		  <one-to-many  class="Employee" />
		</set>
		
		 -->
        <map name="ems">
        <key column="depaer_id"/>
		 <map-key type="string" column="name"/>
		 <one-to-many class="Employee"/>
		 </map>
	</class>
	
</hibernate-mapping>

部门这边的set节点我们没有去配置



当我们去通过部门去访问员工信息的时候 
才会去select  
给查询的方法加上   System.out.println(d.getEms());

就会去查询员工信息 了
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
打开连接成功!Hibernate: insert into Department (name) values (?)
Hibernate: insert into Employee (name, depaer_id) values (?, ?)
Hibernate: insert into Employee (name, depaer_id) values (?, ?)
Hibernate: update Employee set depaer_id=?, name=? where id=?
Hibernate: update Employee set depaer_id=?, name=? where id=?
Hibernate: select department0_.id as id0_0_, department0_.name as name0_0_ from Department department0_ where department0_.id=?
Hibernate: select ems0_.depaer_id as depaer3_1_, ems0_.id as id1_, ems0_.name as name1_, ems0_.id as id1_0_, ems0_.name as name1_0_, ems0_.depaer_id as depaer3_1_0_ from Employee ems0_ where ems0_.depaer_id=?
{}



总结 通过asm和cglib二个包实现;Domain是非final的。
1.session.load懒加载。
2.one-to-one(元素)懒加载:
	必需同时满足下面三个条件时才能实现懒加载
	(主表不能有constrained=true,所以主表没有懒加载)
	lazy!=false 2)constrained=true 3)fetch=select
3.one-to-many (元素)懒加载:1)lazy!=false 2)fetch=select
4.many-to-one (元素) :1)lazy!=false 2)fetch=select
5.many-to-many (元素) :1)lazy!=false 2)fetch=select
6.能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,
访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,
或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。

 

分享到:
评论

相关推荐

    懒加载异常解决.docx

    #### 一、懒加载技术概述 懒加载(Lazy Loading)是一种按需加载策略,在程序设计中广泛应用于减少内存占用和提高系统性能。在Java开发中,尤其针对数据库操作频繁的应用场景,如Hibernate ORM框架等,通过延迟对象...

    hibernate懒加载策略.doc

    - 在一对多关联中,如果配置了懒加载,那么在加载父对象(如部门)时,不会立即加载所有子对象(如员工)。只有当试图遍历或访问子对象时,Hibernate才会执行SQL语句获取子对象数据。 4. **注意事项** - 懒加载...

    bootstrap-treeview树节点实现动态加载(懒加载)

    动态加载(也称为懒加载)是一种优化性能的技术,只在用户需要时才加载数据,而不是一次性加载所有数据,这对于处理大量数据或层级结构尤其有用,可以显著提升页面加载速度和用户体验。 本项目在官方Bootstrap ...

    MyBatis懒加载(延迟加载)

    4. **示例应用**:在实际的MyBatis配置中,你可以这样设置一个懒加载的一对一关联: ```xml &lt;!-- 其他字段映射 --&gt; ``` 然后在Mapper接口中,你可以声明一个返回父对象的方法,父对象中包含一个`Child`...

    MyBatis懒加载

    关联映射通常用于一对一的关系,例如一个用户有一个地址。在MyBatis的XML配置文件中,我们可以使用`&lt;association&gt;`标签来定义这种关系。当设置`fetchType="lazy"`时,表示关联的对象将在首次访问时才加载。例如: ...

    shopex实现图片懒加载所需的jq文件

    2. 对需要懒加载的图片,设置一个默认的占位图(如grey.gif),同时设置`data-src`属性来存储真实图片的URL,而非`src`属性。 3. 使用jQuery选择这些图片,并应用`lazyload`方法,例如:`$("img.lazy").lazyload();`...

    Hibernate一对一关联映射(注解)

    本话题主要探讨的是Hibernate中的一对一关联映射,这是一种将数据库中的单个表映射到Java对象模型中单个类的关系映射技术。通过注解方式实现一对一关联映射,可以避免传统的XML配置文件,使得代码更加简洁、易读。 ...

    知识共享-Android之ListView滑动加载、软缓存、懒加载(雷惊风)

    以上是对"知识共享-Android之ListView滑动加载、软缓存、懒加载"这一主题的详细解释,希望对你理解Android开发中的这些重要概念有所帮助。在实际开发中,熟练掌握这些技巧能够显著提升应用的性能和用户体验。

    Objective-C 懒加载getter 生成器(开发辅助工具)

    在Objective-C中,懒加载是一种优化技术,它推迟了对某些资源或对象的初始化,直到它们真正被使用时才进行。这种策略可以避免在应用启动时不必要的内存消耗,尤其对于大型或者复杂对象,这种优化尤为关键。懒加载...

    LazyLoad原生JavaScript实现的懒加载库兼容到IE8

    懒加载(LazyLoad)是一种优化网页性能的技术,它允许我们延迟加载非关键资源,比如图片、视频或 iframe,直到它们即将进入用户可视区域时才进行加载。这种策略可以显著减少页面初始化时的数据量,提高页面的加载...

    集成spring的hibernate懒加载

    在Hibernate中,懒加载主要体现在一对多、多对一、多对多等关联关系上。当我们在实体类中使用`@OneToMany`、`@ManyToOne`或`@ManyToMany`注解,并设置`fetch = FetchType.LAZY`时,就会启用懒加载。然而,懒加载的...

    hibernate一对一实例

    以上代码首先创建了`Person`和`Passport`对象,然后设置它们的关联关系,最后通过`entityManager`持久化`Person`对象,Hibernate会自动处理一对一关联的保存。 五、查询和关联加载 在查询时,我们可以使用`...

    11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护

    此外,由于懒加载通常依赖于代理对象,因此必须确保在事务范围内访问这些关系,否则可能会遇到“懒加载异常”。 五、注意事项 1. 懒加载可能导致N+1查询问题,即在获取父实体后,每次遍历子实体都会触发一次额外的...

    mybatis延迟加载样例

    2. **懒加载的工作机制**:MyBatis通过代理对象实现延迟加载。当我们尝试访问延迟加载的属性时,代理对象会检查该属性是否已经被加载,如果没有,则执行SQL查询并返回结果。 3. **注意事项**:延迟加载只有在会话...

    图片懒加载

    图片懒加载是一种优化网页性能的技术,它通过延迟加载非视口内的图片,直到用户滚动到它们将要出现在屏幕上的位置时才开始加载。这样可以减少页面初始加载时的数据量,提高页面加载速度,改善用户体验。在JavaScript...

    Hibernate ORM - 一对一连接表关联关系

    在一对一关联中,如果希望关联对象在需要时才加载,可以设置`fetch="lazy"`;否则,关联对象会在主对象加载时一同加载,这称为即时加载。 8. **生命周期管理**: Hibernate提供了对对象状态的管理,包括瞬时态、持久...

    jQuery图片懒加载代码.zip

    jQuery图片懒加载是一种优化网页性能的技术,它允许网页在用户滚动到可视区域时才加载图片,而不是一次性加载所有图片。这种技术尤其适用于大型图片或页面内容丰富的网站,能显著提高页面加载速度,节省用户流量,...

    hibernate一对一关联关系

    默认情况下,一对一关联是懒加载的,意味着关联的对象不会在初始加载时被加载,而是等到真正需要时才从数据库中获取。如果希望关联对象与主对象一起加载,可以设置`fetch = FetchType.EAGER`。 6. ** orphanRemoval...

    douBanList(滚动到底部加载新的,软缓存,懒加载).zip

    在Android开发中,"douBanList(滚动到底部加载新的,软缓存,懒加载)"这个项目可能是一个实现豆瓣图书列表展示的应用示例,它涵盖了几个关键的技术点:无限滚动加载、软缓存策略以及懒加载机制。下面将详细讲解这三...

    解析javascript图片懒加载与预加载的分析总结

    懒加载是一种优化页面加载速度的方法,它的核心思想是延迟页面中非首屏内容的加载,直到用户需要查看这些内容时再进行加载。这样做的好处是减少了初始页面加载的资源量,加快了页面的响应速度,从而提高了用户体验。...

Global site tag (gtag.js) - Google Analytics