spring 事物管理问题请教,多谢~
注册同时插入两张表,member(mid,mail),company(cid,companyname)
代码帖出来,多谢指点~~
config.xml
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
com.mysql.jdbc.Driver
jdbc:mysql://127.0.0.1:3306/infodata?useUnicode=true&characterEncoding=utf-8
root
sa
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
com/cms/po/Company.hbm.xml
com/cms/po/Member.hbm.xml
org.hibernate.dialect.MySQLDialect
true
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
struts-config.xml
<form-beans >
<form-bean name="member" type="com.cms.vo.Member"/>
<form-bean name="regUser" type="com.cms.vo.RegUser"/>
path="/input"
type="org.apache.struts.actions.ForwardAction"
parameter="/regedit.jsp"/>
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.java
public 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());
memberAndCompanyService.createMemberAndCompany(member,
company);
request.setAttribute(AttributeNames.CMS_Client_USER,
new com.cms.vo.Member(member.getMember_id(), member.getEmail());
}
return mapping.findForward("success");
}
}
贴完啦...这样有问题吗?我无法实现回滚(测试时插入比数据库字段长的字符).
[b]问题补充:[/b]
多谢关注... xuxiaolei
没错,表是Innodb类型。
关于这个spring代理事物的配置,我通过main方法实现的时候,是可以回滚了。。。
就是如下方式:
ApplicationContext cxt = new ClassPathXMLApplicatinContext("config.xml");
MemberAndCompanyService memberAndCompanyService = (MemberAndCompanyService)cxt.getBean("memberAndCompanyServiceProxy");
memberAndCompanyService.createMemberAndCompany(member,
company);
那问题说明我上面的事物应该没有起作用吧。。。请教~多谢。
[b]问题补充:[/b]
也就是说直接读取配置文件,而不是采用依赖注入方式。。。。
[b]问题补充:[/b]
感谢 xuxiaolei
确实应该注入事务bean,问题已经解决.