0

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);
        }

2 番目のメソッドが最初のサービス メソッドを呼び出すことに注意してください。私の質問は、2 番目のメソッド内のすべてをアトミックな作業単位として扱いたいことを示す適切な注釈があるとすれば、それは何ですか? 私の最初のメソッドは自動的に @Transactional であるため、混乱しました。

ありがとう - デイブ

4

1 に答える 1

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

現在のトランザクションをサポートし、存在しない場合は新しいトランザクションを作成します。同じ名前のEJBトランザクション属性に類似しています。これは、トランザクションアノテーションのデフォルト設定です。

javadocの最後のコメントに基づくと、これはデフォルトのトランザクション伝播設定であるため、技術的にはアノテーションは必要ありませんが、ほとんどの場合、明確にするためにアノテーションを付けています(デフォルトも変更された場合に備えて)。

于 2013-01-09T23:32:35.553 に答える