聲明式事務

採用聲明式事務

1、聲明式事務配置
* 配置SessionFactory
* 配置事務管理器
* 事務的傳播特性
* 那些類那些方法使用事務

2、編寫業務邏輯方法
* 繼承HibernateDaoSupport類,使用HibernateTemplate來持久化,HibernateTemplate是
Hibernate Session的輕量級封裝
* 默認情況下運行期異常纔會回滾(包括繼承了RuntimeException子類),普通異常是不會滾的
* 編寫業務邏輯方法時,最好將異常一直向上拋出,在表示層(struts)處理
* 關於事務邊界的設置,通常設置到業務層,不要添加到Dao上

相關配置:

<!-- 配置sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>

<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>


<!-- 配置事務的傳播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>


<!-- 那些類的哪些方法參與事務 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* usermgr.manager.*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
</aop:config>
</beans>


HibernateTemplate是 Hibernate Session的輕量級封裝

import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class UserManagerImpl extends HibernateDaoSupport implements {
public void addUser(User user){
this.getHibernateTemplate().save(user);

}
}


使用 HibernateCallback更加靈活操作數據庫
public class YeekuHibernateDaoSupport extends HibernateDaoSupport
{
/**
* 使用hql語句進行分頁查詢
* @param hql 需要查詢的hql語句
* @param offset 第一條記錄索引
* @param pageSize 每頁需要顯示的記錄數
* @return 當前頁的所有記錄
*/
public List findByPage(final String hql,
final int offset, final int pageSize)
{
//通過一個HibernateCallback對象來執行查詢
List list = getHibernateTemplate()
.executeFind(new HibernateCallback()
{
//實現HibernateCallback接口必須實現的方法
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
//執行Hibernate分頁查詢
List result = session.createQuery(hql)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}

/**
* 使用hql語句進行分頁查詢
* @param hql 需要查詢的hql語句
* @param value 如果hql有一個參數需要傳入,value就是傳入hql語句的參數
* @param offset 第一條記錄索引
* @param pageSize 每頁需要顯示的記錄數
* @return 當前頁的所有記錄
*/
public List findByPage(final String hql , final Object value ,
final int offset, final int pageSize)
{
//通過一個HibernateCallback對象來執行查詢
List list = getHibernateTemplate()
.executeFind(new HibernateCallback()
{
//實現HibernateCallback接口必須實現的方法
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
//執行Hibernate分頁查詢
List result = session.createQuery(hql)
//爲hql語句傳入參數
.setParameter(0, value)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}

/**
* 使用hql語句進行分頁查詢
* @param hql 需要查詢的hql語句
* @param values 如果hql有多個個參數需要傳入,values就是傳入hql的參數數組
* @param offset 第一條記錄索引
* @param pageSize 每頁需要顯示的記錄數
* @return 當前頁的所有記錄
*/
public List findByPage(final String hql, final Object[] values,
final int offset, final int pageSize)
{
//通過一個HibernateCallback對象來執行查詢
List list = getHibernateTemplate()
.[color=red]executeFind[/color](new HibernateCallback()
{
//實現HibernateCallback接口必須實現的方法
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
//執行Hibernate分頁查詢
Query query = session.createQuery(hql);
//爲hql語句傳入參數
for (int i = 0 ; i < values.length ; i++)
{
query.setParameter( i, values[i]);
}
List result = query.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章