Аннотация @Transactional не запускает транзакцию (Guice Persist)

Я пытаюсь создать простой класс обслуживания с аннотированным методом @Transactional, используя Guice Persist:

public class TestServiceImpl implements TestService {

    @Inject
    private Provider<EntityManager> entityManager;

    @Override
    @Transactional
    public Long createEvent(String name) {
        Event event = new Event(name);

        System.out.println("Is transaction active? " + entityManager.get().getTransaction().isActive() );

        entityManager.get().persist(event);

        return event.getId();
    }

}

К сожалению, Guice Persist не создает транзакций. Вывод журнала можно увидеть здесь: http://pastebin.com/Mh5BkqSC

Обратите внимание на печать в строке 450:

Транзакция активна? ложный

В результате ничего не сохраняется в базе данных:

mydb=# \d
                 List of relations
 Schema |        Name        |   Type   |  Owner   
--------+--------------------+----------+----------
 public | events             | table    | postgres
 public | hibernate_sequence | sequence | postgres
(2 rows)

mydb=# select * from events;
 id | name 
----+------
(0 rows)

mydb=# 

Я настраиваю приложение следующим образом:

public static void main(String[] args) {
    Injector injector = Guice.createInjector(new TestModule(), new JpaPersistModule("postgresPersistenceUnit"));

    PersistService persistService = injector.getInstance(PersistService.class);
    persistService.start();

    TestService serviceToTest = injector.getInstance(TestService.class);

    Long id = serviceToTest.createEvent("test");

    System.out.println("Id: " + id);
}

Как вы можете видеть, TestService создан Guice, и я использую JpaPersistModule, который должен выполнять проводку @Transactional.

Я создал небольшой проект Maven, демонстрирующий проблему: https://github.com/uldall/guice-persist-error


person uldall    schedule 04.03.2014    source источник


Ответы (2)


Проблема решилась переключением с @javax.transaction.Transactional на @com.google.inject.persist.Transactional. По-видимому, Guice-Persist не поддерживает аннотацию @Transactional из API транзакций Java.

person uldall    schedule 04.03.2014

Я использовал без аннотации @Transactional, и это сработало:

    entityManager.getTransaction().begin();
    entityManager.persist(entity);
    entityManager.getTransaction().commit();
person Justinas Jakavonis    schedule 26.04.2016