Использовать JpaTemplate в Java с обработанными транзакциями? - PullRequest
0 голосов
/ 28 декабря 2010

Я начал изучать возможность использования JpaTemplate для удаления некоторого кода котельной пластины в некоторых моих приложениях.

У меня сейчас что-то вроде этого:

public class SomeDaoClass {

    public SomeDaoClass( boolean handleTransactionsLocally ) {
            _handleTransactionsLocally = handleTransactionsLocally;
    }

    private void persist( final Object object ) throws MyCustomException {
        try {
            if ( _handleTransactionsLocally ) {
                EntityTransaction transaction = getEntityManager().getTransaction();

                transaction.begin();
                getEntityManager().persist( object );
                transaction.commit();
            }
            else {
                getEntityManager().persist( object );
                getEntityManager().flush();
            }
        }
        catch ( Exception exception ) {
            throw new MyCustomException( exception );
        }
    }
}

При запуске из модульного теста я переопределяю getEntityManager() и предоставляю true для конструктора. При развертывании этого на сервере я просто возвращаю внедренный менеджер сущностей из контейнера.

Однако, похоже, что я должен быть в состоянии сделать что-то вроде этого:

        _jpaTemplate = new JpaTemplate( getEntityManager() );
        _jpaTemplate.persist( object );

Как я могу указать в коде Java, как jpaTemplate должен обрабатывать транзакции? Я попытался аннотировать метод с помощью @Transactional, но это не похоже на работу. Нужно ли устанавливать свойство на _jpaTemplate? Это вообще возможно?

ТИА

Ответы [ 2 ]

1 голос
/ 28 декабря 2010

В дополнение к ответу Божо вам на самом деле не нужно использовать JpaTemplate для получения декларативных транзакций.

Типичный подход к использованию JPA с декларативными транзакциями в Spring - это использование общего EntityManager вводится в @PersistenceContext -аннотированное поле.См. 13.5.2 Реализация DAO на основе простого JPA .

1 голос
/ 28 декабря 2010

Помимо добавления @Transactional, вам необходимо указать <tx:annotation-driven /> в вашем applicationContext.xml, а также иметь бин с именем transactionManager, который (в вашем случае) имеет тип org.springframework.orm.jpa.JpaTransactionManager

Как примечание - обычно не стоит делать транзакции DAO. Вместо этого лучше использовать транзакционный уровень сервисного уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...