今天晚上有同事提到這個spring的事務配置,其實我也就知道兩種最簡單的配置。恩,還是寫個例子測試一下吧。環境是:spring2.04+hibernate3.1吧
首先,我使用的mysql,設置mysql為InnoDB類型。
事務管理的控制應該放到業務邏輯層。你可以寫個處理業務邏輯的JavaBean,在該JavaBean中調用DAO(或則是HibernateTemplate()的crud操作),然后把該Bean的方法納入spring的事務管理。
方法一:xml文件定義如下:
//聲明事務管理器
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
//聲明事務代理,使用抽象屬性(abstract="true") 方便所有的業務類都擁有這個事務代理
<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" >
//具體的實現了業務邏輯的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就是我們的實現業務邏輯的JavaBean。我們通過parent元素聲明其事務支持。
在測試的時候,就用
UserManage um=(UserManage) context.getBean("userManager");來取得bean對象(注意上邊的"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);*/
}
}
具體測試類:
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就是我們的實現業務邏輯的JavaBean。
在測試的時候,就用
UserManage um=(UserManage) context.getBean("userManager");來取得bean對象
具體類
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);*/
}
}
具體測試類:
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();
}
}
本人才疏學淺,涉java不深,如果以上配置有什么錯誤或不足的地方,請您指出,將 不甚感激!如果還有別的配置,也請共享一份給我,將感激不盡。
說明:如果你的代碼報:java.lang.ClassCastException: $Proxy7 cannot be cast to 。。。。。的錯誤;
解決方式有兩種:
一種: 為org.springframework.transaction.interceptor.TransactionProxyFactoryBean的bean配置一個property屬性:proxyTargetClass ,并設置其值為true
另一種:就是為你的dao類寫一個接口類,就是說讓你的dao必須實現一個接口。