首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring事务未提交

Spring事务未提交
EN

Stack Overflow用户
提问于 2010-06-08 03:37:11
回答 3查看 20K关注 0票数 4

我正在努力让我的spring托管事务提交,有人能找出我做错了什么吗?我所有的表都是mysql InnonDB表。我的RemoteServiceServlet如下:

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
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如下:

代码语言:javascript
复制
<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}/@propertiesFile@</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,那么我的对象将被永久保留。

代码语言:javascript
复制
<prop key="hibernate.connection.autocommit">true</prop>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-08 04:39:14

当GWT调用createUser时,这个调用不会经过Spring的transactional proxy。为了使用@Transactional,你可以引入额外的间接层:

代码语言:javascript
复制
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来代替它。

票数 4
EN

Stack Overflow用户

发布于 2010-07-15 06:07:48

我遇到了一个类似的问题,事务没有提交,因此在行上创建了锁,直到我发现我有另一个dao (其中有@ transaction注解),它没有参与事务,但仍然在transaction DAO之前被调用。我清理了那把刀,它在后面工作了。

票数 2
EN

Stack Overflow用户

发布于 2013-07-18 21:39:07

使用PROPAGATION_NOT_SUPPORTED,如下所示:

代码语言:javascript
复制
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;
                }
            }
        });
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2992526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档