2014-03-04 39 views
4

我試圖創建一個簡單的服務類使用吉斯堅持一個@Transactional註解的方法:@Transactional註解沒有開始交易(吉斯堅持)

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

} 

遺憾的是沒有交易由吉斯創建堅持。日誌輸出可以在這裏看到: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由吉斯創建,我正在使用JpaPersistModule,這應該是@Transactional接線的內容。

我創建了一個小型Maven項目演示問題:https://github.com/uldall/guice-persist-error

回答

6

問題是由從切換到@javax.transaction.Transactional解決@com.google.inject.persist.Transactional。顯然,Guice-Persist不支持Java Transaction API中的@Transactional註釋。

1

我已經使用沒有@Transactional註解,它的工作:

entityManager.getTransaction().begin(); 
    entityManager.persist(entity); 
    entityManager.getTransaction().commit();