gpt4 book ai didi

java - 将 Hibernate EntityManager 保持在 Runnable 中

转载 作者:行者123 更新时间:2023-11-30 11:33:29 25 4
gpt4 key购买 nike

我有一个 bean,我在其中创建了一个带有 Runnable 的新线程:

@Component
public class MyBean {

private final Task task = new Task();

@PersistenceContext
EntityManager em;

@PostConstruct
public void init() {
task.setEntityManager(em);
new Thread(task).start();
}

public static class Task implements Runnable {

@Setter
private EntityManager em;

@Override
public void run() {
while (true) {
// working with EntityManager
Thing t = em.findById(...); // Fetching a Thing from repo
t.getSomethingList(); // LazyInit exception
wait();
}
}
}
}

使用 init 方法,使用 EntityManager 实例创建新线程。当我尝试从存储库加载某些内容时, session 会立即关闭并获取任何惰性字段导致 无法延迟初始化角色集合:某事,没有 session 或 session 已关闭 来自 Hibernate 的异常。

我尝试了所有的@Transactional 注解都没有效果。我需要实现类似 OpenEntityManagerInView 的东西,但不同之处在于它不在 View 中。

谢谢

编辑1:

  1. 根据评论 - 我尝试使用 em.getTransaction().begin(); 但这让我很困惑 Not allowed to create transaction on shared EntityManager - 使用 Spring transactions或 EJB CMT

  2. skirsch 建议我应该在其他一些 bean 上调用 Transactional 方法。这就是我实际做的——完全按照你的建议。我想让事情变得更简单,但我没有意识到其中的区别,所以我直接在类 Task 中演示了这个问题。总而言之,我完全按照 skirsch 的建议进行操作,但问题仍然存在。

最佳答案

由于 Spring 不管理您的 Runnable,因此注释它不会产生预期的效果。因此,您要么需要在 Runnable 中使用带注释的(和 Spring 管理的)bean,要么需要手动处理 txn 管理。

使用Spring事务管理

你定义了某种服务

@Service
public class MyService {
@PersistenceContext
EntityManager em;

@Transactional
public void doSomething() {
Thing t = em.findById(...);
t.getSomethingList();
}
}

然后你的 bean 看起来像这样:

@Component
public class MyBean {

private final Task task = new Task();

@Autowired
MyService service;

@PostConstruct
public void init() {
task.setService(service);
new Thread(task).start();
}

public static class Task implements Runnable {

@Setter
private MyService service;

@Override
public void run() {
while (true) {
service.doSomething();
wait();
}
}
}
}

手动交易管理

如果您设置了 JPA 资源本地事务,请执行以下操作:

// working with EntityManager
em.getTransaction().begin()
try {
Thing t = em.findById(...);
t.getSomethingList();
} finally {
em.getTransaction().rollback()
}
wait();

关于java - 将 Hibernate EntityManager 保持在 Runnable 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16119723/

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