看了上面兩段代碼的配置,沒有壹行配置就和用Ruby on Rails的ActiveRecord相差甚遠,比較麻煩,暫時延遲也沒辦法。spring實現中的事務管理主要是這兩種方法。
使用spring通常集成hibernate/ibatis作為數據訪問層,這也是大多數java開發者常用的words的技術框架。比如結合spring和hibernate作為數據訪問層,暫且不討論泛型的存在,只是舉個簡單的例子把事務管理放在數據訪問層下面,講講我自己理想中的spring事務管理。
約定高於配置。首先規定以查詢列表show get find開始的方法要采用PROPAGATION_REQUIRED readOnly級別的事務定義,以set save update remove delete開始的方法要采用PROPAGATION_REQUIRED級別的事務定義庫。這樣可以滿足大部分開發的需求,然後只需要在需要事務管理配置的類前增加壹個元數據就可以了,比如spring為hibernate開發的@ Transactionaop (hibernate),裏面有類似@ transaction AOP(Hibernate)@ transaction AOP(ibatis)@ transaction AOP(JDO)這樣的元數據。
舉個例子來看壹段代碼,其中UserDAO是壹個接口。大家應該看到,只要增加壹行metadata @ transaction AOP(hibernate)就可以讓這個UserDAHibernate類具備事務管理的功能,因為它的命名方式符合spring的約定(當然,這是不成立的,spring中沒有這個功能。這只是我個人的想法)。
密碼
包appfuse dao hibernate
導入java util列表;導入appfuse dao UserDAO導入appfuse模型用戶;導入springframework orm hibernate支持HibernateDaoSupportspan style=顏色:藍色;>//假設有以下其中壹個類:導入spring框架ORM hibernate支持註解事務AOP
< span style= color:藍色;> @ transaction op(hibernate)公共類UserDAOHibernate擴展了HibernateDaoSupport實現了UserDAO {
公共用戶getUser(Long userId){ return(User)this gethibernate template()get(User類userId);}
public List get users(){ return this gethibernate template()find(來自用戶);}
public void remove User(Long userId){ Object User = this gethibernate template()load(User類userId);這個getHibernateTemplate() delete(用戶);} public void save User(User User){ this gethibernate template()saveourupdate(User);} }
Spring的事務定義非常靈活和寬泛,它定義了7種傳播行為和5種隔離常數,但使用的次數還是比較多的,即PROPAGATION_REQUIRED和PROPAGATION_REQUIRED readOnly,所以我提出上面的假設可以簡單展開。
簡單就是美
Lishi Xinzhi/Article/program/Java/ky/201311/29082