hibernate的延迟加载通用方法

类名:HibernateUtil

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(.); // 取得你要展示的对象
// 如果这个对象当中有延迟加载的对象(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 "  }); 
呵,如果你要是在HIBERNATE当中使用,这个就太简单了吧。

怎么样?呵呵呵,
从此,我对STRUTS的标签深恶痛绝,而对JSTL情有独钟了。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值