2014-03-04 38 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();