2010-06-07 346 views
3

我正在努力讓我的春季託管交易提交,有人可能會發現我做錯了什麼。我所有的表都是MySQL InnonDB表。我RemoteServiceServlet(GWT)如下:春季交易沒有提交

public class TrainTrackServiceImpl extends RemoteServiceServlet implements TrainTrackService { 

@Autowired 
private DAO dao; 

@Override 
public void init(ServletConfig config) throws ServletException { 
    super.init(config); 
    WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()); 
    AutowireCapableBeanFactory beanFactory = ctx.getAutowireCapableBeanFactory(); 
    beanFactory.autowireBean(this); 
} 

    @Transactional(propagation= Propagation.REQUIRED, rollbackFor=Exception.class) 
public UserDTO createUser(String firstName, String lastName, 
    String idNumber, String cellPhone, String email, int merchantId) { 
    User user = new User(); 

    user.setFirstName(firstName); 
    user.setLastName(lastName); 
    user.setIdNumber(idNumber); 
    user.setCellphone(cellPhone); 
    user.setEmail(email); 
     user.setDateCreated(new Date()); 

    Merchant merchant = (Merchant) dao.find(Merchant.class, merchantId); 
    if (merchant != null) { 
    user.setMerchant(merchant); 
    } 

    // Save the user. 
    dao.saveOrUpdate(user); 
    UserDTO dto = new UserDTO(); 
    dto.id = user.getId(); 
    dto.firstName = user.getFirstName(); 
    dto.lastName = user.getLastName(); 
    return dto; 
} 

的DAO如下:

public class DAO extends HibernateDaoSupport { 

private String adminUsername; 
private String adminPassword; 
private String godUsername; 
private String godPassword; 

public String getAdminUsername() { 
    return adminUsername; 
} 

public void setAdminUsername(String adminUsername) { 
    this.adminUsername = adminUsername; 
} 

public String getAdminPassword() { 
    return adminPassword; 
} 

public void setAdminPassword(String adminPassword) { 
    this.adminPassword = adminPassword; 
} 

public String getGodUsername() { 
    return godUsername; 
} 

public void setGodUsername(String godUsername) { 
    this.godUsername = godUsername; 
} 

public String getGodPassword() { 
    return godPassword; 
} 

public void setGodPassword(String godPassword) { 
    this.godPassword = godPassword; 
} 

public void saveOrUpdate(ModelObject obj) { 
    getHibernateTemplate().saveOrUpdate(obj); 
} 

而我的applicationContext.xml如下:

<context:annotation-config/> 

<context:component-scan base-package="za.co.xxx.traintrack.server"/> 

<!-- Application properties --> 
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>file:${user.dir}/@[email protected]</value> 
     </list> 
    </property> 
</bean> 

<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${connection.dialect}</prop> 
      <prop key="hibernate.connection.username">${connection.username}</prop> 
      <prop key="hibernate.connection.password">${connection.password}</prop> 
      <prop key="hibernate.connection.url">${connection.url}</prop> 
      <prop key="hibernate.connection.driver_class">${connection.driver.class}</prop> 
      <prop key="hibernate.show_sql">${show.sql}</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.c3p0.min_size">5</prop> 
      <prop key="hibernate.c3p0.max_size">20</prop> 
      <prop key="hibernate.c3p0.timeout">300</prop> 
      <prop key="hibernate.c3p0.max_statements">50</prop> 
      <prop key="hibernate.c3p0.idle_test_period">60</prop> 
     </props> 
    </property> 
    <property name="annotatedClasses"> 
     <list> 
      <value>za.co.xxx.traintrack.server.model.Answer</value> 
      <value>za.co.xxx.traintrack.server.model.Company</value> 
      <value>za.co.xxx.traintrack.server.model.CompanyRegion</value> 
      <value>za.co.xxx.traintrack.server.model.Merchant</value> 
      <value>za.co.xxx.traintrack.server.model.Module</value> 
      <value>za.co.xxx.traintrack.server.model.Question</value> 
      <value>za.co.xxx.traintrack.server.model.User</value> 
      <value>za.co.xxx.traintrack.server.model.CompletedModule</value> 
     </list> 
    </property> 
</bean> 

<bean id="dao" class="za.co.xxx.traintrack.server.DAO"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    <property name="adminUsername" value="${admin.user.name}"/> 
    <property name="adminPassword" value="${admin.user.password}"/> 
    <property name="godUsername" value="${god.user.name}"/> 
    <property name="godPassword" value="${god.user.password}"/> 
</bean> 

<bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref local="sessionFactory"/> 
    </property> 
</bean> 

<!-- enable the configuration of transactional behavior based on annotations --> 
<tx:annotation-driven transaction-manager="transactionManager"/> 

如果我將sessionFactory屬性更改爲autoCommit = true,那麼我的對象會變得持久。

<prop key="hibernate.connection.autocommit">true</prop> 
+0

你嘗試調高春天的日誌,看看到底這是怎麼回事了? – 2010-06-07 20:00:09

回答

4

當GWT調用createUser,此調用不通過Spring的transactional proxy去。爲了使用@Transactional您可以引入一個間接的附加級別:

public class TrainTrackServiceWrapper extends RemoteServiceServlet implements TrainTrackService { 

    @Autowired 
    private TrainTrackServiceImpl impl; 

    ... 

    public UserDTO createUser(String firstName, String lastName, 
     String idNumber, String cellPhone, String email, int merchantId) { 

     return impl.createUser(firstName, lastName, idNumber, cellPhone, email, merchantId); 
    } 

} 

public class TrainTrackServiceImpl implements TrainTrackService { 

    @Autowired 
    private DAO dao; 

    @Transactional(propagation= Propagation.REQUIRED, rollbackFor=Exception.class) 
    public UserDTO createUser(String firstName, String lastName, 
     String idNumber, String cellPhone, String email, int merchantId) { 
     ... 
    } 
} 

編輯:您還可以使用spring4gwt代替它。

+0

謝謝,你是一個傳奇人物 – 2010-06-08 21:02:34

2

我有一個類似的問題,事務沒有提交,因此在行上創建了鎖,直到我發現我有另一個沒有參與事務但仍然在事務性dao之前調用的DAO(帶有@transactional註釋)。 我清理了那個道,它的工作後續。

0

使用PROPAGATION_NOT_SUPPORTED象下面這樣:

public CustomerReportEntity publishReportInTransaction(final CustomerReportEntity report) { 
     final TransactionTemplate transactionTemplate = new TransactionTemplate(this.transactionManagerWDB); 
       transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED); 
     return (CustomerReportEntity) transactionTemplate.execute(new TransactionCallback() { 
      @Override 
      public CustomerReportEntity doInTransaction(final TransactionStatus transactionStatus) { 
       try { 
        return generateReportinTransaction(report); 

       } catch (final Exception e) { 
        report.setReportStatus(ReportStatus.EXCEPTION.getStatus()); 
        pendingProcessorDao.updateStatus(report, "Exception"); 
        return null; 
       } 
      } 
     }); 
    }