gpt4 book ai didi

java - 如何提交当前的 guice-persist UnitOfWork?

转载 作者:行者123 更新时间:2023-11-29 03:50:06 27 4
gpt4 key购买 nike

我在后台任务方法(由 Quartz 操作)中使用 UnitOfWork,在 hibernate 之上使用 Guice-persist。后台任务调用一个服务,它需要在它的任务中间提交当前事务——然后继续另一个事务。我如何提交当前的 UnitOfWork 并创建一个新的?

class BackgroundJob {
@Inject UnitOfWork unitOfWork;
@Inject MyService myService;
public void run() {
try {
unitOfWork.begin();
myService.foo();
} finally {
unitOfWork.end();
} } }

class MyServiceImpl implements MyService {
@Override public void foo() {
foo1();
// I would like to commit here and start a new transaction
foo2();
} }

该服务也由 Guice 管理,但它是一个单例,并且无法访问调用方 UnitOfWork 原样

理想情况下,我不想更改服务签名。一个解决方法是调用者将两个 UnitOfWork 作为参数传递给 foo(),但这似乎有点乱七八糟。

编辑:为了方便 future 的读者使用,这里是我对 ColinD 给出的解决方案的实现,非常符合要求:

class BackgroundJob {
@Inject UnitOfWork unitOfWork;
@Inject MyService myService;
public void run() {
try {
unitOfWork.begin();
myService.foo();
} finally {
unitOfWork.end();
} } }

class MyServiceImpl implements MyService {
@Override public void foo() {
foo1();
foo2();
}
@Transactional private void foo1() { ... }
@Transactional private void foo2() { ... }
}

最佳答案

如果我没记错的话,Guice Persist 中的一个工作单元不是单个事务。相反,它代表单个工作单元,例如单个 Web 请求,或者在您的情况下,单个后台作业。我相信单个数据库连接用于整个工作单元,但该工作单元可能有多个不同的事务。事实上,我认为只是开始和结束一个工作单元不会导致任何事务的开始或结束。

我想你想做的是用@Transactional。只要没有包含两个调用的外部事务,它们就会分别在一个单独的事务中运行。

关于java - 如何提交当前的 guice-persist UnitOfWork?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9198564/

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