2013-01-09 26 views
0

我使用Spring 3.1.1.RELEASE,休眠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 /> 

我有一個春季服務類具有以下方法:

@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以來,我感到困惑。

謝謝 - 戴夫

回答

0

更新基於評論


您可以用REQUIRED傳播註釋create()方法:

@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意味着,如果有當前的交易,它將使用相同的交易。否則,它會創建一個新的事務的方法來在執行的Javadoc REQUIRED

支持當前事務,如果不存在,創建一個新的。類似於同名的EJB事務屬性。這是交易註釋的默認設置。

基於javadoc的最後評論,這是默認的事務傳播設置,所以在技術上你不需要註釋,但我幾乎總是把它放在這樣它很清楚(櫃面默認變化好!)。

+0

嗨,這是我正在尋找的對立面。當我說「我希望第二種方法中的所有內容都被當作原子工作單元」時,我的意思是說我希望事務成爲第二種方法所做的事情+第一種方法,而不是2個事務 - 第二種方法做一些東西,然後調用第一種方法。這是否有道理我在問什麼? – Dave

+0

@Dave根據您的意見更新了我的答案。 –