【问题标题】:@Transactional annotation not starting transaction (Guice Persist)@Transactional 注释未启动事务(Guice Persist)
【发布时间】:2014-04-05 17:37:49
【问题描述】:

我正在尝试使用 Guice Persist 创建一个带有 @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();
    }

}

很遗憾,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

【问题讨论】:

    标签: java hibernate jpa transactions guice-persist


    【解决方案1】:

    我在没有@Transactional 注释的情况下使用过并且它有效:

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

    【讨论】:

      【解决方案2】:

      问题已通过从@javax.transaction.Transactional 切换到@com.google.inject.persist.Transactional 得到解决。显然 Guice-Persist 不支持来自 Java Transaction API 的 @Transactional 注释。

      【讨论】:

        猜你喜欢
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 2014-10-29
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 2014-02-14
        • 1970-01-01
        相关资源
        最近更新 更多