`
jjs_love
  • 浏览: 80965 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate的延迟加载通用方法(转)

    博客分类:
  • ORM
阅读更多

package com.antbee.j2eemodel.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Iterator;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class HibernateUtil extends HibernateDaoSupport {

/**
* 初始化POJO类
@author @家军
@param object POJO对象
@param methodName 方法名称
@return
@version 1.0
*/
public void initialize(Object object, String methodName) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {

String[] methodArray 
= methodName.split("\\.");
Method method 
= null;
Object initializeObject 
= object;

if(methodArray.length == 1){
this.getHibernateTemplate().lock(initializeObject, org.hibernate.LockMode.NONE);
method 
= object.getClass().getMethod(methodArray[0], new Class[] {});
initializeObject 
= method.invoke(initializeObject, new Object[] {});
this.getHibernateTemplate().initialize(initializeObject);
}
else{
for(int i=0;i<methodArray.length;i++){
method 
= initializeObject.getClass().getMethod(methodArray[i], new Class[] {});
initializeObject 
= method.invoke(initializeObject, new Object[] {});
}
this.getHibernateTemplate().lock(initializeObject, org.hibernate.LockMode.NONE);
this.getHibernateTemplate().initialize(initializeObject);
}
}

/**
* 初始化POJO类
@author @家军
@param object POJO对象
@param methodName 方法名称数组
@return
@version 1.0
*/
public void initialize(Object object, String methodName[])
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {

for (int i = 0; i < methodName.length; i++) {
String[] methodArray 
= methodName[i].split("\\.");
Method method 
= null;
Object initializeObject 
= object;

if(methodArray.length == 1){
this.getHibernateTemplate().lock(initializeObject, org.hibernate.LockMode.NONE);
method 
= object.getClass().getMethod(methodArray[0], new Class[] {});
initializeObject 
= method.invoke(initializeObject, new Object[] {});
this.getHibernateTemplate().initialize(initializeObject);
}
else{
for(int j=0;j<methodArray.length;j++){
method 
= initializeObject.getClass().getMethod(methodArray[j], new Class[] {});
initializeObject 
= method.invoke(initializeObject, new Object[] {});
}
this.getHibernateTemplate().lock(initializeObject, org.hibernate.LockMode.NONE);
this.getHibernateTemplate().initialize(initializeObject);
}
}

}

/**
* 初始化POJO类
@author @家军
@param object POJO对象
@return
@version 1.0
*/
public void initialize(Object object) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
this.getHibernateTemplate().lock(object, org.hibernate.LockMode.NONE);
this.getHibernateTemplate().initialize(object);
}

/**
* 初始化POJO类
@author @家军
@param collection POJO对象集合
@param methodName 方法名称数组
@return
@version 1.0
*/
public void initialize(Collection collection, String methodName[])
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {

for(Iterator i=collection.iterator();i.hasNext()Wink{
Object object 
= i.next();
this.initialize(object,methodName);
}
}

/**
* 初始化POJO类
@author @家军
@param collection POJO对象集合
@param methodName 方法名称
@return
@version 1.0
*/
public void initialize(Collection collection, String methodName)
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {

for(Iterator i=collection.iterator();i.hasNext()Wink{
Object object 
= i.next();
this.initialize(object,methodName);
}
}

这个方法的好外是:可以不在hbm.xml的文件当中,指定为lazy=true这个模式,可以直接使用。使用方法如下:
如果你使用SPRING,则需要把hibernateUtil注入其中:

<!----> <bean id="hibernateUtilTarget" class="com.antbee.j2eemodel.util.HibernateUtil">
<property name="sessionFactory">
<ref local="mssqlSessionFactory" />
</property>
</bean>

<bean id="hibernateUtil" parent="BaseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target">
<ref local="hibernateUtilTarget" />
</property>
</bean>
<!--配置基础事务-->
<bean id="BaseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager">
<ref bean="mssqltransactionManager" />
</property>
<property name="proxyTargetClass">
<value>true</value>
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean> 


使用示例:
如果你使用STRUTS,则需要这样:

<!---->List what_ur_view = XXXManager.find(.);

呵,如果你要是在HIBERNATE当中使用,这个就太简单了吧。

怎么样?呵呵呵,
从此,我对STRUTS的标签深恶痛绝,而对JSTL情有独钟了。

//取得你要展示的对象
//如果这个对象当中有延迟加载的对象(SET)时,则需要如下加载就行
this.hibernateUtil.initialize(what_ur_view, "getTbShipmentSale");
//其中getTbShipmentSale是其对象(SET也可以操作) 


在页面显示的时候,你就可以使用JSTL如下表述:

<!----><c:out value="${what_ur_view.tbShipmentSale.goodsReceivePersonPhone}" />//呵呵,是不是很爽呀。 


同样的方法,我们也可以对一个SET在页面进行显示,方法如下:

<!----><c:forEach items="${what_ur_view.tbShipmentProductMappingSet}" var="ProductMapping" varStatus="status">
<c:out value="${ProductMapping.productNum}" />
<c:out value="${ProductMapping.tbOutOfWarehouse.outOfWarehouseNum}" />
</c:forEach>
//呵呵,支持多级嵌套, 


在ACTION当中则需要加入

<!---->hibernateUtil.initialize(what_ur_view.getTbShipmentProductMappingSet(),
new String[] { "getTbProduct""getTbOutOfWarehouse",
"getTbProductConfigure" }); 
分享到:
评论

相关推荐

    ssh 分页代码(延迟加载)

    在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而这里的"ssh 分页代码(延迟加载)"指的是在SSH框架下实现分页查询时采用的延迟加载技术。延迟加载是一种优化策略,它允许我们在...

    hibernate通用dao

    - 支持延迟加载(Lazy Loading),默认关联关系是懒加载的,提高性能。 - 引入了二级缓存,可以通过插件如Ehcache来提高应用性能。 - 提供了更好的类型系统,支持更多的Java类型映射。 在实际项目中,通过创建一个...

    hibernate3必要jar包

    10. **性能优化**:Hibernate提供了批处理、延迟加载、缓存策略等方法来优化性能。 这个“hibernate3必要jar包”确保了这些关键组件的存在,使得开发者可以快速地搭建一个具备基本功能的Hibernate3环境,进行数据库...

    hibernate性能优化方案

    综上所述,Hibernate性能优化涉及多个层面,包括但不限于数据库设计、HQL编写、API选择、配置参数调整、缓存管理、延迟加载以及事务控制策略等。通过对这些方面的综合考量和优化,可以极大地提升Hibernate应用程序的...

    hibernate4.3.11所需jar包

    9. **性能优化**: Hibernate提供了多种性能优化手段,如批处理、延迟加载、结果集缓存等,以适应不同的应用场景。 总结来说,"hibernate4.3.11所需jar包"不仅包含Hibernate的核心库,还涉及到一系列依赖的第三方库...

    hibernate教程打包下载,史上最全的HIBERNATE

    10. **性能优化**:教程可能涵盖如何优化Hibernate,例如批量操作、延迟加载、缓存策略调整、避免N+1查询问题等。 11. **实例分析**:通过实际项目案例,演示如何在Web应用(如Spring Boot)中整合Hibernate,解决...

    hibernate相关jar包

    - ASM或CGlib:用于动态代理和字节码操作,是Hibernate实现延迟加载和代理的基础。 5. **引入依赖**:在Java项目中,这些jar包通常通过Maven或Gradle等构建工具管理。在pom.xml或build.gradle文件中添加对应的依赖...

    hibernate 3.5.5 常用jar包

    18. **延迟加载(Lazy Loading)**:默认情况下,关联对象会在需要时才加载,以减少数据库访问。 19. **级联操作**:可以设置在操作一个实体时,是否自动对关联的实体执行相同的操作。 20. **代理类**:Hibernate...

    hibernate整理

    `Session.get()`根据主键直接获取对象,`Session.load()`则返回一个代理对象,实际加载延迟到属性访问时。`Criteria API`和HQL提供更灵活的查询方式,可以构造复杂的查询条件。 `Hibernate_util.java`文件很可能...

    Hibernate_3.2中文手册(chm+pdf)

    10. **性能优化**:手册还会涉及到Hibernate的性能调优技巧,如延迟加载、批处理、预加载等,帮助开发者提升应用性能。 此外,《Hibernate Reference 3.3.2 GA》可能是针对稍后版本的参考文档,尽管版本号不同,但...

    Hibernate5.2.11高清版,最新版本

    抓取策略(Fetching)介绍了Hibernate如何抓取对象及其关联对象,包括延迟加载和立即加载的策略选择。 批量操作(Batching)涉及如何执行数据库批处理操作,这对于执行大量数据更新或插入非常有用。 缓存机制...

    Hibernate 核心类库

    在Hibernate中,它用于动态生成持久化类的代理对象,实现了延迟加载(Lazy Loading)和其他高级特性。 `antlr-2.7.7.jar`是ANTLR(Another Tool for Language Recognition)库,是一个强大的解析器生成器,用于读取...

    超好用的hibernate查询工具类

    同时,为了保证代码的健壮性,工具类还需要考虑异常处理,提供合适的日志输出,以及适当的性能优化措施,如延迟加载和预加载。 通过创建和使用这样一个超好用的Hibernate查询工具类,我们可以更高效地管理和操作...

    hibernate概述

    通常情况下,为了防止空指针异常,我们使用 `get()`,但在系统优化时,如果确信对象存在,使用 `load()` 可以利用延迟加载特性。`load()` 返回的是代理对象,而 `get()` 直接返回实体对象。 3. **Hibernate 优点**...

    学习笔记hibernate所需jar包.rar

    Hibernate利用它来实现一些高级特性,比如延迟加载(Lazy Loading)。 7. **日志支持**: Hibernate使用`slf4j-api.jar`和`slf4j-log4j12.jar`(或其他的SLF4J绑定)进行日志记录。SLF4J是一个简单易用的日志门面...

    Manning - Java Persistence With Hibernate.pdf

    12. **性能优化**:包括批处理更新、缓存策略、预加载、延迟加载、查询优化等多个方面,以提高Hibernate在大型系统中的性能表现。 《Java Persistence with Hibernate》这本书将详细讲解以上这些概念和实践,帮助...

    Struts,Hibernate,Spring经典面试题收藏

    Hibernate提供了延迟加载功能,即在实际需要时才加载数据,以节省内存。它支持多种数据库,通过配置文件实现对象关系映射(ORM),简化了DAO层的编程。Hibernate的缓存机制包括一级缓存(内部缓存)和二级缓存,一级...

    Hibernate中文参考文档pdf

    - **代理模式**:对于懒加载的关联,Hibernate 使用代理模式来实现延迟加载。 - **拦截器**:允许在对象状态改变时进行拦截处理,如日志记录或验证等。 ### 性能优化技巧 - **批处理**:批量执行 SQL 语句可以显著...

    Hibernate程序性能优化.doc

    - **属性延迟加载**:对对象的某些属性进行延迟加载,减少初始化时的数据加载量。 #### 七、方法选用 1. **结果集处理**:使用ScrollableResults或Iterator替代List或Set,以避免一次性加载大量数据导致内存溢出。...

    Hibernate框架详细讲解

    ### Hibernate框架详细讲解 #### 一、什么是Hibernate框架? Hibernate是一种用于Java应用程序的持久化框架。...此外,Hibernate还具备许多高级特性,如缓存机制、延迟加载等,这些都将进一步增强应用程序的性能。

Global site tag (gtag.js) - Google Analytics