Я использую JPA в настольном приложении Swing. Это то, что мой код выглядит следующим образом:Как сделать окончательно в try-finally ждать окончания потоков?
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()
?
Почему вы манипулируете сущностями, используя 'SwingUtilities.invokeLater'? точка этого метода заключается в обновлении gui _after_, когда вы выполняете работу по обновлению. – jtahlborn
Боюсь, что в один прекрасный день я неожиданно запустил бы ленивый выбор. – jocki
Lazy fetching - ваша настоящая проблема, поэтому работайте над ее решением. Ваш код, как написано, является * полной противоположностью * того, как вы должны работать с Swing. И так как поток EDT * никогда не заканчивается *, пока ваша программа не выйдет, ваше основное предположение о том, как должен выполняться ваш код, неверно. – kdgregory