`
bulote
  • 浏览: 1353907 次
文章分类
社区版块
存档分类
最新评论

hibernate lazy——延迟加载

 
阅读更多
hibernate lazy策略可以使用在:
* <class>标签上,可以取值:true/false ,在hibernate3以上版本,默认是true
* <property>标签上,可以取值:true/false 需要类增强工具
* <set><list>标签上,可以取值:true/false/extra
* <one-to-one><many-to-one>单端关联上,可以取值:false/proxy/no-proxy

lazy概念:只有真正使用该对象时,才会创建,对于hibernate而言,正真使用的时候才会发出sql

hibernate支持lazy策略只有在session打开状态下有效



1 <class>标签上:


group.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.model">
<wbr><wbr><wbr><span style="color:#ed1c24; font-weight:bold">&lt;class name="Group" table="group5" lazy="true" &gt; //lazy,默认true,可不写</span><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;id name="id" column="id" type="java.lang.Integer"&gt;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;generator class="native" /&gt;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;/id&gt;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;property name="name" column="name" length="50" type="java.lang.String" /&gt;<br><wbr><wbr><wbr> &lt;/class&gt;<br> &lt;/hibernate-mapping&gt;<br><br><span style="font-weight:bold">测试用例:</span><br><br> public class LazyTest extends TestCase<br><br> {<br><br> public void testLoad1(){<br><wbr><wbr> Session session = null;<br><wbr><wbr> Transaction ta = null;<br><wbr><wbr> try{<br><wbr><wbr><wbr> session = HibernateUtil.getSession();<br><wbr><wbr><wbr> ta = session.beginTransaction();<br><br><wbr><wbr><wbr> //还没发出sql,lazy起延迟作用,若lazy=false,则发出sql<br><br><wbr><wbr><wbr> Group g2 = (Group) session.load(Group.class, 1);<br><wbr><wbr><wbr> Group g3 = (Group) session.get(Group.class, 1);<wbr><wbr> //不支持lazy<br><wbr><wbr><wbr> System.out.println("group.id=" + g2.getId());<wbr><wbr><wbr><wbr> //还没发出sql,<br><wbr><wbr><wbr> System.out.println("group.name=" + g2.getName()); //发出sql<br><wbr><wbr><wbr> ta.commit();<br><wbr><wbr> }catch(Exception e){<br><wbr><wbr><wbr> e.printStackTrace();<br><wbr><wbr><wbr> if(ta != null){<br><wbr><wbr><wbr><wbr> ta.rollback();<br><wbr><wbr><wbr> }<br><wbr><wbr> }finally{<br><wbr><wbr><wbr> //关闭session, user变为detached离线对象<br><wbr><wbr><wbr> HibernateUtil.closeSession(session);<br><wbr><wbr> }<br><wbr><wbr> // System.out.println("group.name=" + g2.getName());<br><wbr><wbr> // <span style="font-weight:bold"><span style="color:#ed1c24">hibernate支持lazy策略只有在session打开状态下有效,所以此出Exception</span></span><br> }<br><br> }<br><br style="font-weight:bold; color:rgb(237,28,36)"><span style="color:#ed1c24; font-weight:bold">&lt;class&gt;标签上的lazy特性只对普通属性起作用</span><br style="font-weight:bold; color:rgb(237,28,36)"><br style="font-weight:bold; color:rgb(237,28,36)"><span style="color:#ed1c24; font-weight:bold">&lt;class&gt;标签上的lazy不会影响到单端关联上的lazy特性</span><br><br><br><br><br><span style="color:#ed1c24; font-weight:bold">2.&lt;set&gt;&lt;list&gt;标签上,可以取值:true/false/extra,默认是true</span><br><br><span style="font-weight:bold">Classes.hbm.xml</span><br><br> &lt;?xml version="1.0" encoding="utf-8"?&gt;<br> &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br> "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br> &lt;hibernate-mapping package="com.zd.model"&gt;<br><wbr><wbr><wbr> &lt;class name="Classes" table="classes" &gt;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;id name="id" column="id" type="java.lang.Integer"&gt;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;generator class="native" /&gt;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;/id&gt;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;property name="name" column="name" type="java.lang.String" /&gt;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color:#ed1c24; font-weight:bold"> &lt;set name="students" lazy="true"&gt;</span> <span style="color:#ed1c24; font-weight:bold"> //可不配lazy,因默认是true</span><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;key column="class_id" /&gt;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;one-to-many class="com.zd.model.Student" /&gt;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;/set&gt;<br><wbr><wbr><wbr> &lt;/class&gt;<br><br> &lt;/hibernate-mapping&gt;<br><br> 测试用例:<br><br> public void testLoad1(){<br><wbr><wbr> Session session = null;<br><wbr><wbr> Transaction ta = null;<br><wbr><wbr> try{<br><wbr><wbr><wbr> session = HibernateUtil.getSession();<br><wbr><wbr><wbr> ta = session.beginTransaction();<br><wbr><wbr><wbr> Classes c = (Classes) session.load(Classes.class, new Integer(2));<wbr> //没有sql<br><wbr><wbr><wbr> System.out.println("Class.name=" + c.getName());<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //发出一条sql,但不查 set<br><wbr><wbr><wbr> Set stuSet = c.getStudents();<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
分享到:
评论

相关推荐

    j2ee项目实训——hibernate框架技术

    3.延迟加载(Lazy Loading):只在真正需要时加载关联对象,避免数据冗余,节省内存。 六、最佳实践 1. 分离业务逻辑和数据访问:通过DAO(Data Access Object)模式,将数据库操作封装起来,提高代码复用性。 2. ...

    Hibernate 转译中文版

    8. **延迟加载**(Lazy Loading):Hibernate允许对关联对象进行延迟加载,即只有在真正需要时才会加载,从而避免了不必要的数据库访问,提高了效率。 9. **事件监听器**:Hibernate允许自定义事件监听器,实现对...

    Hibernate5实例程序

    优化包括合理设置缓存策略、避免N+1查询问题、批量操作、延迟加载等。理解并合理运用这些技巧,可以显著提升Hibernate应用的性能。 通过《Hibernate5实例程序》中的代码示例,读者可以亲手实践上述各个知识点,...

    Hibernate夏昕

    8. **延迟加载与立即加载**:Hibernate支持延迟加载(Lazy Loading)和立即加载(Eager Loading)。延迟加载可以提高程序性能,只有在真正需要时才加载关联的对象;而立即加载则会在加载主对象时一并加载关联对象。 ...

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day1_day2_day3_day4

    5.2 lazy loading:延迟加载策略,只在真正需要时加载关联对象,避免内存消耗过大。 5.3 分页查询:使用Criteria的setFirstResult()和setMaxResults()进行分页,提高查询效率。 5.4 异步处理:在大数据量操作时,...

    Hibernate手把手教学

    - 懒加载(Lazy Loading)延迟加载关联的对象,直到真正需要时才加载,提高性能。 - 立即加载(Eager Loading)则会在获取主对象时一并加载关联的对象。 10. **缓存机制** - Hibernate 提供了第一级缓存...

    hibernate全套学习课件ppt

    11. **延迟加载(Lazy Loading)**:为提高性能,Hibernate允许某些关联关系在需要时才加载,避免了不必要的数据库查询。 12. **事件监听器**:Hibernate提供了一些预定义的事件,如保存、更新、删除等,可以通过...

    Hibernate(session管理)

    例如,批处理可以减少数据库交互次数,懒加载可以延迟加载关联对象,以降低内存消耗。 综上所述,理解和熟练掌握Hibernate中的Session管理对于开发高效、健壮的Java应用程序至关重要。正确地使用Session,结合事务...

    Hibernate教程24_Hibernate的1+N问题

    - FetchType.LAZY:表示懒加载,延迟到需要时再加载关联数据。 - FetchType.EAGER:表示急加载,与主对象一起立即加载关联数据。 3. HQL和 Criteria API的优化: - 在HQL查询中使用`JOIN FETCH`,这将执行一个...

    hibernate.jar

    延迟加载(Lazy Loading)是Hibernate的一大特性,仅在真正需要时才加载关联的对象,避免了内存浪费。而即时加载(Eager Loading)则是在加载主对象时,同时加载其关联的对象。 7. **事件监听** Hibernate支持...

    hibernate.zip

    7. **懒加载与即时加载**: Hibernate提供了懒加载机制,通过`@LazyCollection(LazyCollectionOption.EXTRA)`或`@OneToMany(mappedBy = "...', fetch = FetchType.LAZY)`来实现延迟加载,减少初始加载的数据量。...

    懒加载异常解决.docx

    例如,在Hibernate中查询一个对象并尝试访问其延迟加载的关联对象时,如果没有正确的Session管理机制,就可能会引发此类异常。 **具体原因包括:** 1. **Session过早关闭:** 如果在事务或请求结束时关闭了Session...

    hibernate5.2.3.jar

    9. **性能优化**:提供了延迟加载(Lazy Loading)、批处理(Batch Processing)等机制,有效提升系统性能。 10. **增强型注解支持**:在5.2.3版本中,对Java 8的日期时间API和注解支持更加完善,提升了代码的...

    Hibernate实体层设计

    例如,通过懒加载(Lazy Loading)策略,我们可以延迟加载关联的对象,以减少数据库查询次数。同时,合理使用缓存(如一级缓存Session和二级缓存Region)可以显著提升系统性能。 另外,Hibernate的事务管理同样重要...

    Hibernate_4.1.1_中文_参考文档_设计文档

    Hibernate 支持延迟加载(Lazy Loading),只有在真正需要时才会加载关联的对象,以此避免加载过多无用数据,提高性能。 八、性能优化 包括批处理、缓存利用、预加载、连接池的使用等策略,可以帮助开发者优化...

    hibernate-3.2.5 java doc

    7. **性能优化**:Hibernate提供了多种性能优化手段,如延迟加载(lazy loading)、批处理(batch processing)和预加载(fetching strategies)。延迟加载避免了无用的对象加载,批处理减少了数据库交互次数,预...

    Hibernate Quickly

    8. **性能优化**:探讨Hibernate性能优化策略,包括延迟加载(Lazy Loading)、批处理(Batch Processing)、缓存管理以及如何避免N+1查询问题。 9. **JPA支持**:由于Hibernate也是Java Persistence API(JPA)的...

    java软件工程师面试题库

    2. **集合类型的延迟加载**:对于一对多或多对多的关系,可以在映射文件中使用`lazy="true"`来延迟加载集合。 3. **属性延迟加载**:Hibernate 3引入了对实体属性的延迟加载支持。通过在映射文件中设置`lazy="true...

    HibernateDemo

    **正文** Hibernate是一个开源的对象关系映射(ORM)框架,它是Java开发人员在处理关系数据库时的得力工具。...在深入学习过程中,还可以涉及事务管理、关联映射、延迟加载(Lazy Loading)、级联操作等高级主题。

    hibernate 教程

    延迟加载(Lazy Loading)是Hibernate的一项重要特性,它允许关联对象在实际需要时才从数据库加载,从而避免了不必要的查询,提高效率。例如,实体的集合属性默认配置为懒加载。 ### 九、性能优化 优化Hibernate...

Global site tag (gtag.js) - Google Analytics