gpt4 book ai didi

java - @Transactional 注释未启动事务(Guice Persist)

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:23 25 4
gpt4 key购买 nike

我正在尝试使用 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 行的打印:

Is transaction active? false

结果是数据库中没有存储任何内容:

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

最佳答案

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

关于java - @Transactional 注释未启动事务(Guice Persist),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22167659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com