저는 Swing 기반 데스크톱 응용 프로그램에서 JPA를 사용하고 있습니다. 내가 거래를 필요로하는 모든 방법이 try - catch - finally
을 사용하고마침내 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;
}
:이처럼 내 코드는 모습입니다. SwingUtilities.invokeLater()
메서드를 제외하고 예상대로 작동합니다.
finally
은 새 스레드의 모든 코드가 실행되기 전에 도달합니다. 따라서 SwingUtilities.invokeLater()
안에 JPA 작업이 있으면 트랜잭션이 커밋되었으므로 실패합니다.
try - catch - finally
의 일반적인 사용 사례는 SwingUtilities.invokeLater()
내부의 코드를 포함하여 모든 코드가 실행 된 후에 만 트랜잭션이 커밋된다는 것을 확인할 수 있습니까?
왜 'SwingUtilities.invokeLater'를 사용하여 엔티티를 조작하고 있습니까? 이 방법의 핵심은 업데이트 작업을 완료 한 후 GUI를 업데이트하는 것입니다. – jtahlborn
언젠가는 내가 예기치 않게 게으른 페치를 유발할까 봐 걱정됩니다. – jocki
게으른 인출이 실제 문제이므로이를 해결하십시오. 쓰여진 코드는 Swing을 사용하는 방법과 정반대입니다. 그리고 프로그램이 종료 될 때까지 EDT 스레드 *가 끝나지 않기 때문에 코드가 어떻게 실행되어야하는지에 대한 기본 가정이 올바르지 않습니다. – kdgregory