2013-11-01 2 views
3

인 경우 OpenJPA에 대한 문제를 고민하고 있습니다.OpenJPA 쿼리가 실행되고 주문이

나는 방법이 있습니다

START : 업데이트 ...
업데이트 com.sk.entity.Employee 전자

public void update() { 
    System.out.println("START: Update..."); 
    updateEmployee(employee); 
    updateStudent(student); 
    System.out.println("END: Update..."); 
} 
updateEmployee(employee) { 
    employeeDAO.update(employee); 
} 

updateStudent(student) { 
    studentDAO.update(student); 
} 

을하지만이 같은이 내가 얻고 로그를 실행할 때 업데이트 ...
openjpa.j :
갱신 com.sk.entity.Student의 세트 ...
END ... 설정 dbc.SQL - 실행 prepstmnt 2036496738 업데이트 학생 SET ...
openjpa.jdbc.SQL - prepstmnt에게 2036496738 UPDATE 직원 SET를 실행 ... 여기

내가 아직 받고 있지 않다 :

  • updateEmplyoee 메서드를 호출하는 즉시 업데이트 쿼리가 실행되지 않는 이유는 무엇입니까? "END : Update ..."라는 로그 문 다음에 sql이 인쇄 된 로그를 볼 수 있습니다.

  • 왜 STUDENT 테이블이 먼저 업데이트 되는지요? 메서드 호출 당 처음에 updateEmployee를 호출합니다.

누락 된 내용을 알고있는 사람은 누구든지 회신 해주십시오.

답변

4

거래 처리에 관한 것입니다. 트랜잭션은 대개 비 EJB 환경에서 EJB 메소드를 호출 할 때 시작되고 동일한 EJB 메소드의 끝에서 완료됩니다. 따라서 updateEmployee와 updateStudent는 동일한 EJB (JTA) 트랜잭션에서 실행됩니다.

update()를 호출하면 EJB 트랜잭션이 시작됩니다. updateEmployee 및 updateStudent를 호출하면 변경 내용이 메모리에 저장됩니다. update() 메소드가 끝날 때 트랜잭션이 성공한 것처럼 보일 때 OpenJPA는 모든 비 지속 변경 사항을 메모리에서 데이터베이스로 임의의 순서로 유지하기 시작합니다. 이러한 변경 사항을 지속하면 데이터베이스에 커밋을 보냅니다. 데이터베이스 커밋이 성공하면 성공으로 EJB 트랜잭션을 완료합니다.

같은 순서로 데이터를 유지하려면 EntityManager의 flush() 메소드를 사용할 수 있습니다. 내가 메모리에 보관하지 (내가 updateEmployee 및 updateStudent를 호출 할 때, JPA가 데이터베이스에있는 모든 비 지속 변화를 지속해야하는지 확인하는 방법,

@TransactionAttribute(REQUIRES_NEW) 
public void updateStudent(...) {...} 
+0

확인 : 또는 당신은 updateStudent 및 updateEmployee 방법에 대한 새로운 트랜잭션을 시작할 수 있습니다). 두 번째로 나는 왜 STUDENT 테이블이 먼저 지속되는지 알지 못했습니다. – SKumar

+0

EntityManager에는 flush() 메소드가 있습니다. –

+0

또는 새로운 트랜잭션을 시작할 수 있습니다. 응답에 추가합니다 : @TransactionAttribute (REQUIRES_NEW) public void updateStudent (...) {...} –