2014-03-04 4 views
4

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

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

ответ

6

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

1

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

entityManager.getTransaction().begin(); 
    entityManager.persist(entity); 
    entityManager.getTransaction().commit(); 
Смежные вопросы