呵呵,在忙一個項目,潛水很久,現在冒個泡:
(本文適用在struts+spring+hibernate3上做開發的蟲蟲們)
類名: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情有獨鐘了。