如何创建一个调用另一个服务方法事务的服务方法?

时间:2013-01-09 23:12:36

标签: spring hibernate jpa transactions annotations

我正在使用Spring 3.1.1.RELEASE,Hibernate 4.1.0.Final,JPA 2.0和MySQL 5.5我在Spring应用程序上下文文件中定义了事务,如下所示:

    <jee:jndi-lookup jndi-name="java:jboss/springboard/sbpersistence" id="entityManagerFactory"
                 expected-type="javax.persistence.EntityManagerFactory" />

    <bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
            <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <tx:jta-transaction-manager />

我有一个Spring服务类,它有以下方法:

@Service
@Transactional
public class UserServiceImpl implements UserService
{

        @Override
        public User create(String firstName,
                   String middleName,
                   String lastName,
                   String userName,
                   String password,
                   String url,
                   Role role,
                   Organization org,
                   final Set<Contract> contracts)
        {
            …
            return userDao.save(user);
        }

        @Override
        public User createSampleUser(String firstName,
                             String middleName,
                             String lastName,
                             String userName,
                             String password,
                             String url,
                             Role role,
                             State state,
                             List<Product> products,
                             Date activationDate,
                             Date expirationDate)
        {        
            …
            return create(firstName,
                  middleName,
                  lastName,
                  userName,
                  password,
                  url,
                  role,
                  sampleDistrict,
                  contracts);
        }

请注意,第二个方法调用第一个服务方法。我的问题是什么是适当的注释,如果有的话,表明我希望第二种方法中的所有内容都被视为原子工作单元?我很困惑,因为我的第一种方法是@Transactional。

谢谢, - 戴夫

1 个答案:

答案 0 :(得分:0)

基于评论的更新


您可以使用create()

的传播来注释REQUIRED方法
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public User create(String firstName,
               String middleName,
               String lastName,
               String userName,
               String password,
               String url,
               Role role,
               Organization org,
               final Set<Contract> contracts)
    {
        …
        return userDao.save(user);
    }

REQUIRED表示如果有当前事务,它将使用同一事务。否则,它将为要执行的方法创建一个新事务。REQUIRED的javadoc:

  

支持当前事务,如果不存在则创建新事务。类似于同名的EJB事务属性。这是事务注释的默认设置。

根据javadoc的最后一条评论,这是默认的事务传播设置,所以从技术上讲你不应该需要注释,但我几乎总是把它放在一边以便它清楚(也包括默认的更改!)