Runnable で新しいスレッドを作成する Bean があります。
@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 のインスタンスで新しい Thread を作成します。リポジトリから何かをロードしようとすると、セッションが即座に閉じられ、遅延フィールドを取得するとfailed to lazily initialize a collection of role: Something, no session or session was closed
、Hibernate から例外が発生します。
@Transactional アノテーションをすべて試しましたが、効果はありませんでした。OpenEntityManagerInView のようなものを達成する必要がありますが、これはビュー内にないという違いがあります。
ありがとう
EDIT1:
コメントによると - 私は使用してみ
em.getTransaction().begin();
ましたが、これは私を取得していますNot allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT
。スキルシュは、他の Bean で Transactional メソッドを呼び出すべきだと提案しました。それが私が実際に行っていることです-まさにあなたが提案したとおりです。もっと簡単にしたかったのですが、違いがわからなかったので、クラスで直接問題をデモしました
Task
。要約すると、スカーシュが示唆したのとまったく同じですが、問題は解決しません。