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&amp;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");
}}贴完啦...这样有问题吗?我无法实现回滚(测试时插入比数据库字段长的字符).

解决方案 »

  1.   

    http://topic.csdn.net/u/20081005/22/27583caf-f6cf-491f-86e9-60f5d397c340.html
    回答多次了懒得写了,
      

  2.   

    他俩不不样呀!
    <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异常及其子类的异常就回滚 
      

  3.   

    感谢关注...回hl_ghost :他俩不不样呀!一楼回帖太快了,我没来的及修改了.
    应该是<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;