上面的二段配置文件代碼是常用的spring事務管理配置
看完上面的二段代碼的配置和Ruby on Rails沒有一行配置的ActiveRecord相比差太遠相對麻煩拖拉沒有辦法暫時spring實現中事務管理主要也只是這兩種方法
使用spring通常會與hibernate/ibatis集成作數據訪問層這也是大多java開發人員常用字的技術框架下面如spring和hibernate結合做數據訪問層暫時不討論有泛型存在的情況只是簡單舉一個例子把事務管理放在數據訪問層下面說出我自己心中理想的spring事務管理
約定高於配置首先規定對於querylistshowgetfind等開頭的方法采用PROPAGATION_REQUIREDreadOnly級的事務定義而對於setsaveupdateremovedelete等開頭的方法采用PROPAGATION_REQUIRED級的事務定義基本上能滿足大部分開發的需要然後只要在需要事務管理配置的類的前加一句元數據即可例如spring針對hibernate開發的@TransactionAop(hibernate)類似的有@TransactionAop(hibernate)@TransactionAop(ibatis)@TransactionAop(jdo)之類元數據的
舉一個例子看一段代碼其中UserDAO是一個接口大家都應該看得出來只加了一行的元數據@TransactionAop(hibernate)就可以使得這一個UserDAHibernate類有事務管理的功能因為它命名的方法符合spring的約定(當然這不是真的spring中也沒有這一個功能這只是我個人一點想法提出來而已)
代碼
package orgappfusedaohibernate;
import javautilList;
import orgappfusedaoUserDAO;
import orgappfusemodelUser;
import orgspringframeworkormhibernatesupportHibernateDaoSupport;
span style=color:blue; > //假設有下面這一個類
import orgspringframeworkormhibernatesupportannotationsTransactionAop; </span>
<span style=color:blue; >@TransactionAop(hibernate)</span>
public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO{
public User getUser(Long userId) {
return (User)thisgetHibernateTemplate()get(Userclass userId);
}
public List getUsers() {
return thisgetHibernateTemplate()find(from User);
}
public void removeUser(Long userId) {
Object user = thisgetHibernateTemplate()load(Userclass userId);
thisgetHibernateTemplate()delete(user);
}
public void saveUser(User user) {
thisgetHibernateTemplate()saveOrUpdate(user);
}
}
spring的事務定義很靈活很廣定義七種的傳播行為和五種的隔離常量但用得比較多還是PROPAGATION_REQUIRED和PROPAGATION_REQUIREDreadOnly所以我提出上面所述的一點假想可以簡便開發
簡單就是美
[] []
From:http://tw.wingwit.com/Article/program/Java/ky/201311/29082.html