spring 事物管理问题请教,多谢~注册同时插入两张表,member(mid,mail),company(cid,companyname)
代码帖出来,多谢指点~~config.xml<bean id="companyService" class="com.cms.service.impl.CompanyServiceImpl">
<property name="companyDAO">
<ref local="companyDAO"></ref>
</property>
</bean>
<bean id="memberService" class="com.cms.service.impl.MemberServiceImpl">
<property name="memberDAO">
<ref local="memberDAO"></ref>
</property>
</bean>
<bean id="memberAndCompanySecService" class="com.cms.service.impl.MemberAndCompanyServiceImpl">
<property name="memberDAO">
<ref local="memberDAO"></ref>
</property>
<property name="companyDAO">
<ref local="companyDAO"></ref>
</property>
</bean><bean name="/regedit" class="com.cms.web.action.RegeditAction">
<property name="memberAndCompanyService">
<ref bean="memberAndCompanyService"/>
</property>
<property name="memberService">
<ref bean="memberService"/>
</property>
</bean><bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/infodata?useUnicode=true&characterEncoding=utf-8</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>sa</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>com/cms/po/Company.hbm.xml</value>
<value>com/cms/po/Member.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="memberAndCompanyServiceProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="memberAndCompanyService" />
</property>
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="companyDAO" class="com.cms.dao.impl.CompanyDAOImpl">
<property name="sessionFactory">
<ref local="sessionFactory"></ref>
</property>
</bean>
<bean id="memberDAO" class="com.cms.dao.impl.MemberDAOImpl">
<property name="sessionFactory">
<ref local="sessionFactory"></ref>
</property>
</bean>
struts-config.xml
<form-beans >
<form-bean name="member" type="com.cms.vo.Member"/>
<form-bean name="regUser" type="com.cms.vo.RegUser"/>
</form-beans>
<action-mappings >
<action path="/regedit" type="org.springframework.web.struts.DelegatingActionProxy" name="regUser">
<forward name="success" path="/main.jsp" />
<forward name="input" path="/input.do" />
</action>
<action
path="/input"
type="org.apache.struts.actions.ForwardAction"
parameter="/regedit.jsp"/>
</action-mappings> <message-resources parameter="com.cms.web.ApplicationResources" />
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/classes/config.xml" />
</plug-in>
company和member的dao接口以及impl类就不帖了....帖封装事物的service
MemberAndCompanyService.java
public interface MemberAndCompanyService {
public abstract void createMemberAndCompany(Member member, Company company);
}
MemberAndCompanyServiceImpl.java
public class MemberAndCompanyServiceImpl implements MemberAndCompanyService { private Logger log = Logger.getLogger(this.getClass().getName());
public MemberDAO memberDAO;
public void setMemberDAO(MemberDAO memberDAO){
this.memberDAO = memberDAO;
}
public MemberDAO getMemberDAO(){
return memberDAO;
}
public CompanyDAO companyDAO;
public void setCompanyDAO(CompanyDAO companyDAO){
this.companyDAO = companyDAO;
}
public CompanyDAO getCompanyDAO(){
return companyDAO;
}
public void createMemberAndCompany(Member member, Company company){
memberDAO.createMember(member);
company.setCom_id(member.getMember_id());//company表的主键与member的主键一致
companyDAO.createCompany(company);
}
}RegeditAction.javapublic class RegeditAction extends Action { private Logger log = Logger.getLogger(this.getClass().getName()); private MemberAndCompanyService memberAndCompanyService; public MemberAndCompanyService getMemberAndCompanyService() {
return memberAndCompanyService;
} public void setMemberAndCompanyService(
MemberAndCompanyService memberAndCompanyService) {
this.memberAndCompanyService = memberAndCompanyService;
} private MemberService memberService; public void setMemberService(MemberService memberService) {
this.memberService = memberService;
} public MemberService getMemberService() {
return memberService;
} public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) { com.cms.vo.RegUser regUser = (com.cms.vo.RegUser) form;
Member member = memberService.queryMember(regUser.getEmail());
Company company = new Company();
if (member != null && member.getMember_id() > 0) {
request.setAttribute(AttributeNames.CMS_ERRORS, "已经被注册的用户名。");
return mapping.findForward("input");
} else {
member.setEmail(regUser.getEmail()); company.setCom_id(member.getMember_id());
company.setCompanyname(regUser.getCom_name()); memberAndCompanySecService.createMemberAndCompanySec(member,
companySec);
request.setAttribute(AttributeNames.CMS_Client_USER,
new com.cms.vo.Member(member.getMember_id(), member.getEmail());
}
return mapping.findForward("success");
}}贴完啦...这样有问题吗?我无法实现回滚(测试时插入比数据库字段长的字符).
代码帖出来,多谢指点~~config.xml<bean id="companyService" class="com.cms.service.impl.CompanyServiceImpl">
<property name="companyDAO">
<ref local="companyDAO"></ref>
</property>
</bean>
<bean id="memberService" class="com.cms.service.impl.MemberServiceImpl">
<property name="memberDAO">
<ref local="memberDAO"></ref>
</property>
</bean>
<bean id="memberAndCompanySecService" class="com.cms.service.impl.MemberAndCompanyServiceImpl">
<property name="memberDAO">
<ref local="memberDAO"></ref>
</property>
<property name="companyDAO">
<ref local="companyDAO"></ref>
</property>
</bean><bean name="/regedit" class="com.cms.web.action.RegeditAction">
<property name="memberAndCompanyService">
<ref bean="memberAndCompanyService"/>
</property>
<property name="memberService">
<ref bean="memberService"/>
</property>
</bean><bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/infodata?useUnicode=true&characterEncoding=utf-8</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>sa</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>com/cms/po/Company.hbm.xml</value>
<value>com/cms/po/Member.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="memberAndCompanyServiceProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="memberAndCompanyService" />
</property>
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="companyDAO" class="com.cms.dao.impl.CompanyDAOImpl">
<property name="sessionFactory">
<ref local="sessionFactory"></ref>
</property>
</bean>
<bean id="memberDAO" class="com.cms.dao.impl.MemberDAOImpl">
<property name="sessionFactory">
<ref local="sessionFactory"></ref>
</property>
</bean>
struts-config.xml
<form-beans >
<form-bean name="member" type="com.cms.vo.Member"/>
<form-bean name="regUser" type="com.cms.vo.RegUser"/>
</form-beans>
<action-mappings >
<action path="/regedit" type="org.springframework.web.struts.DelegatingActionProxy" name="regUser">
<forward name="success" path="/main.jsp" />
<forward name="input" path="/input.do" />
</action>
<action
path="/input"
type="org.apache.struts.actions.ForwardAction"
parameter="/regedit.jsp"/>
</action-mappings> <message-resources parameter="com.cms.web.ApplicationResources" />
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/classes/config.xml" />
</plug-in>
company和member的dao接口以及impl类就不帖了....帖封装事物的service
MemberAndCompanyService.java
public interface MemberAndCompanyService {
public abstract void createMemberAndCompany(Member member, Company company);
}
MemberAndCompanyServiceImpl.java
public class MemberAndCompanyServiceImpl implements MemberAndCompanyService { private Logger log = Logger.getLogger(this.getClass().getName());
public MemberDAO memberDAO;
public void setMemberDAO(MemberDAO memberDAO){
this.memberDAO = memberDAO;
}
public MemberDAO getMemberDAO(){
return memberDAO;
}
public CompanyDAO companyDAO;
public void setCompanyDAO(CompanyDAO companyDAO){
this.companyDAO = companyDAO;
}
public CompanyDAO getCompanyDAO(){
return companyDAO;
}
public void createMemberAndCompany(Member member, Company company){
memberDAO.createMember(member);
company.setCom_id(member.getMember_id());//company表的主键与member的主键一致
companyDAO.createCompany(company);
}
}RegeditAction.javapublic class RegeditAction extends Action { private Logger log = Logger.getLogger(this.getClass().getName()); private MemberAndCompanyService memberAndCompanyService; public MemberAndCompanyService getMemberAndCompanyService() {
return memberAndCompanyService;
} public void setMemberAndCompanyService(
MemberAndCompanyService memberAndCompanyService) {
this.memberAndCompanyService = memberAndCompanyService;
} private MemberService memberService; public void setMemberService(MemberService memberService) {
this.memberService = memberService;
} public MemberService getMemberService() {
return memberService;
} public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) { com.cms.vo.RegUser regUser = (com.cms.vo.RegUser) form;
Member member = memberService.queryMember(regUser.getEmail());
Company company = new Company();
if (member != null && member.getMember_id() > 0) {
request.setAttribute(AttributeNames.CMS_ERRORS, "已经被注册的用户名。");
return mapping.findForward("input");
} else {
member.setEmail(regUser.getEmail()); company.setCom_id(member.getMember_id());
company.setCompanyname(regUser.getCom_name()); memberAndCompanySecService.createMemberAndCompanySec(member,
companySec);
request.setAttribute(AttributeNames.CMS_Client_USER,
new com.cms.vo.Member(member.getMember_id(), member.getEmail());
}
return mapping.findForward("success");
}}贴完啦...这样有问题吗?我无法实现回滚(测试时插入比数据库字段长的字符).
解决方案 »
- jxl 生成Excel 相关问题 疑惑 请大侠们指教
- jsp文件上传
- response may not have been initialized或者response can't be resolved
- 菜鸟发问,JSP里面没有用到CSS,读取的页面数据颜色确始终修改不了,到底怎么解决呢?
- 为什么会报错?在使用过滤器时???????
- 网页自动跳转
- Java(JBoss)启动后内存达到2G
- Linux下如何配置TomcatPlugin到Eclipse中?
- 然没得回家过年了,各位大哥,一定要再拉小弟一把呀!如何用一个循环把一棵JTree树画出来呀,有源码例子最好
- 结交jsp学友(向asp版中的人学习)
- spring定时器
- 在struts中实现缩略图是出现的问题
回答多次了懒得写了,
<bean id="memberAndCompanySecService" class="com.cms.service.impl.MemberAndCompanyServiceImpl"> <property name="target">
<ref local="memberAndCompanyService" />
简单说下这里:
<props>
<prop key="create*">PROPAGATION_REQUIRED </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
</props> The final facet of the transaction pentagon is a set of rules that define what exceptions
prompt a rollback and which ones do not. By default, transactions are rolled
back only on runtime exceptions and not on checked exceptions. (This behavior
is consistent with rollback behavior in EJBs.)上面的话说明,spring只回滚uncheck exceptions,所有楼主的配置没有问题(因为你没有try catch,所以如果有异常,一定是uncheck exceptions),当楼主的service对象的方法有throws XXExcetion时,这时楼主就要注意了,因为spring默认是不会回滚的,加上-Exception就OK了,意思是说,当出现exception异常及其子类的异常就回滚
应该是<bean id="memberAndCompanyService" class="com.cms.service.impl.MemberAndCompanyServiceImpl">来着.
问题已经解决了,我的问题出在没有注入事务bean,呵呵.即:memberAndCompanyServiceProxy对程序部分做如下修改:
1.
<bean name="/regedit" class="com.cms.web.action.RegeditAction">
<property name="memberAndCompanyServiceProxy">
<ref bean="memberAndCompanyServiceProxy"/>
</property>
<property name="memberService">
<ref bean="memberService"/>
</property>
</bean> 2.RegeditAction.do
private MemberAndCompanyService memberAndCompanyService; public MemberAndCompanyService getMemberAndCompanyServiceProxy() {
return memberAndCompanyService;
} public void setMemberAndCompanyServiceProxy( MemberAndCompanyService memberAndCompanyService) {
this.memberAndCompanyService = memberAndCompanyService;
}