huangyongyun 2008-10-11 12: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-12 07:41
    关注

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








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

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

报告相同问题?

悬赏问题

  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思