huangyongyun 2008-10-11 04:49
浏览 257
已采纳

spring 事物管理问题请教,多谢~

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,问题已经解决.

展开全部

  • 写回答

2条回答 默认 最新

  • xuxiaolei 2008-10-11 23:41
    关注

    是不是这个地方,在action中你注入了memberAndCompanyService而不是注入了memberAndCompanyServiceProxy,只有被事务代理过的bean才会有事务控制。
    [code="xml"]








    [/code]
    个人意见,仅供参考。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部