今天晚上有同事提到這個(gè)spring的事務(wù)配置,其實(shí)我也就知道兩種最簡(jiǎn)單的配置。恩,還是寫個(gè)例子測(cè)試一下吧。環(huán)境是:spring2.04+hibernate3.1吧
首先,我使用的mysql,設(shè)置mysql為InnoDB類型。
事務(wù)管理的控制應(yīng)該放到業(yè)務(wù)邏輯層。你可以寫個(gè)處理業(yè)務(wù)邏輯的JavaBean,在該JavaBean中調(diào)用DAO(或則是HibernateTemplate()的crud操作),然后把該Bean的方法納入spring的事務(wù)管理。
方法一:xml文件定義如下:
//聲明事務(wù)管理器
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
//聲明事務(wù)代理,使用抽象屬性(abstract="true") 方便所有的業(yè)務(wù)類都擁有這個(gè)事務(wù)代理
<bean id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
<bean id="userManager" parent="baseTransactionProxy">
<property name="target" >
//具體的實(shí)現(xiàn)了業(yè)務(wù)邏輯的JavaBean
<bean class="org.zdpuyao.srm.service.imp.UserManageImp">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
</property>
</bean>
org.zdpuyao.srm.service.imp.UserManageImp就是我們的實(shí)現(xiàn)業(yè)務(wù)邏輯的JavaBean。我們通過parent元素聲明其事務(wù)支持。
在測(cè)試的時(shí)候,就用
UserManage um=(UserManage) context.getBean("userManager");來取得bean對(duì)象(注意上邊的"userManager"配置)
具體類
package org.zdpuyao.srm.service.imp;
public class UserManageImp extends HibernateDaoSupport implements UserManage {
public void addUser(Object obj) {
TblBsDepartmentType dept; //=(TblBsDepartmentType)temp.find("from TblBsDepartmentType").get(0);
dept = new TblBsDepartmentType();
dept.setBdtyName("java12");
getHibernateTemplate().save(dept);
///throw new ("ssss");
//throw new RuntimeSQLException("sssss");
/*TblBsUserType user = (TblBsUserType)obj;
user.setTblBsDepartmentType(dept);
temp.save(user);*/
}
}
具體測(cè)試類:
public class TestUser extends TestCase {
protected void setUp() throws Exception {
super.setUp();
}
private BeanFactory getFactory()
{
Resource res=new FileSystemResource("\\WebRoot\\WEB-INF\\applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(res);
return factory;
}
private UserManage getUserManage()
{
BeanFactory factory=getFactory();
UserManage um=(UserManage) factory.getBean("userManager");
return um;
}
public void testAddUser() throws Exception {
TblBsUserType user = new TblBsUserType();
user.setButyId(Long.valueOf(12345645));
user.setButyName("yangchuan");
user.setButyPassword("12345");
getUserManage().addUser(user);
//excuteJDBCTranscation();
}
}
///////////////////////////////////////////
方法二:xml文件定義如下:
1: 第一步:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
1: 第二步:
<bean id="userManager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="false">
<property name="transactionManager" ref="transactionManager" />
<property name="target">
<ref local="userManagerimp" />
</property>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
1: 第三步:
<bean id="userManagerimp"
class="org.zdpuyao.srm.service.imp.UserManageImp">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
org.zdpuyao.srm.service.imp.UserManageImp就是我們的實(shí)現(xiàn)業(yè)務(wù)邏輯的JavaBean。
在測(cè)試的時(shí)候,就用
UserManage um=(UserManage) context.getBean("userManager");來取得bean對(duì)象
具體類
package org.zdpuyao.srm.service.imp;
public class UserManageImp extends HibernateDaoSupport implements UserManage {
public void addUser(Object obj) {
TblBsDepartmentType dept; //=(TblBsDepartmentType)temp.find("from TblBsDepartmentType").get(0);
dept = new TblBsDepartmentType();
dept.setBdtyName("java12");
getHibernateTemplate().save(dept);
///throw new ("ssss");
//throw new RuntimeSQLException("sssss");
/*TblBsUserType user = (TblBsUserType)obj;
user.setTblBsDepartmentType(dept);
temp.save(user);*/
}
}
具體測(cè)試類:
public class TestUser extends TestCase {
protected void setUp() throws Exception {
super.setUp();
}
private BeanFactory getFactory()
{
Resource res=new FileSystemResource("\\SRMnew\\WebRoot\\WEB-INF\\applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(res);
return factory;
}
private UserManage getUserManage()
{
BeanFactory factory=getFactory();
UserManage um=(UserManage) factory.getBean("userManager");
return um;
}
public void testAddUser() throws Exception {
TblBsUserType user = new TblBsUserType();
user.setButyId(Long.valueOf(12345645));
user.setButyName("yangchuan");
user.setButyPassword("12345");
getUserManage().addUser(user);
//excuteJDBCTranscation();
}
}
本人才疏學(xué)淺,涉java不深,如果以上配置有什么錯(cuò)誤或不足的地方,請(qǐng)您指出,將 不甚感激!如果還有別的配置,也請(qǐng)共享一份給我,將感激不盡。
說明:如果你的代碼報(bào):java.lang.ClassCastException: $Proxy7 cannot be cast to 。。。。。的錯(cuò)誤;
解決方式有兩種:
一種: 為org.springframework.transaction.interceptor.TransactionProxyFactoryBean的bean配置一個(gè)property屬性:proxyTargetClass ,并設(shè)置其值為true
另一種:就是為你的dao類寫一個(gè)接口類,就是說讓你的dao必須實(shí)現(xiàn)一個(gè)接口。