我在基于 Swing 的桌面应用程序中使用 JPA。这就是我的代码的样子:
public Object methodA() {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
boolean hasError = false;
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// JPA operation does not work here
// because transaction has been committed!
}
});
...
return xXx;
} catch (Exception ex) {
hasError = true;
em.getTransaction().rollback();
} finally {
em.close();
if (!hasError) {
em.getTransaction().commit();
}
}
return null;
}
我将它try - catch - finally
用于所有需要事务的方法。它按预期工作,除了具有SwingUtilities.invokeLater()
.
finally
将在新线程中的所有代码执行之前到达;因此,如果内部有 JPA 操作SwingUtilities.invokeLater()
,则会因为事务已提交而失败。
是否有一个try - catch - finally
我可以遵循的通用用例来确保只有在所有代码(包括内部代码)都已执行后才会提交事务SwingUtilities.invokeLater()
?