2011-08-18 2 views
2

트랜잭션 내에서 동일한 개체를 두 번 저장해야하지만 최대 절전 모드는 항상 한 번만 SQL 업데이트를 수행합니다. 다음은 코드입니다 :최대 절전 모드 : 트랜잭션 내에서 동일한 개체를 두 번 저장해야합니다.

.... 
session.beginTransaction(); 
Student s = session.get(Student.class, id); 

// (1) first save 
s.setSequenceNum(10); 
session.saveOrUpdate(s); 

// (2) second save 
s.setSequenceNum(9); 
session.saveOrUpdate(s); // save again 

session.getTransaction().commit(); 
session.close(); 

최대 절전 모드는 첫 번째를 무시하고 오직 초 동안 하나의 SQL 업데이트를해야합니다. 최대 절전 모드에서 두 SQL 업데이트를 모두 수행하도록하려면 어떻게해야합니까? 우리 프로젝트의 요구 사항이기 때문에 필요합니다.

+0

어떻게 첫 번째 것을 무시하고 두 번째 만 업데이트했는지 어떻게 알 수 있습니까? 데이터베이스를 혼자서 보았으므로 첫 번째 요청을 무시한 것으로 알 수는 없습니다 ... –

+0

두 번째 업데이트가 첫 번째를 덮어 쓰게되므로이 경우 중복됩니다. 실행해야하는 일종의 db 트리거가있는 경우 이것이 내가 볼 수있는 유일한 이유는 –

+0

왜 두 개의 업데이트가 필요합니까 ?? –

답변

4

첫 번째 업데이트 후에 session.flush()를 시도하거나 첫 번째 업데이트 전에 session.setFlushMode (FlushMode.Always)를 설정하십시오. setFlushmode는 트랜잭션 후 재사용되는 경우 전체 세션에 영향을 미친다는 것을 기억하십시오.

+0

감사합니다. session.setFlushMode (FlushMode.Always)를 설정하면 문제가 해결 될 수 있습니다. 성능에 영향을 줍니까? 나는 그것이 더 느리게 될 것인가 아닌가를 의미한다. – hebing

+0

http://docs.jboss.org/hibernate/core/3.5/javadocs/org/hibernate/FlushMode.html db에 대해 더 많은 sql 쿼리를 수행하므로 느려질 수 있습니다. –

9

saveOrUpdate은 연결된 인스턴스에서 완전히 필요하지 않습니다. 최대 절전 모드가 자동으로 트랜잭션의 끝 부분에 부착 된 객체

  • 의 상태를 지속됩니다
  • 그 결과 플러시 호출 할 때 세션에 명시 적으로 객체
  • 의 새로운 상태에 따라 다릅니다 수있는 쿼리를 실행할 때

첨부 된 개체는 세션에서 가져 오거나로드하거나 쿼리를 호출하여 가져온 개체이거나 persist, save, update 또는 merge (를 통해 영구 보존 한 개체입니다. 이 후자의 경우 전달 된 객체는 첨부되지 않지만 반환 된 객체는).

그런데 saveOrUpdate은 왜 유용합니까? 일시적이거나 분리 된 객체를 영구적으로 만드는 것이 유용합니다. 즉, 세션이 새롭거나 이전에 첨부 되었기 때문에 세션에 연결되지 않은 객체가 세션이 닫힐 때 분리됩니다.

최대 절전 모드의 아이디어는 가능한 한 최신 상태로 필요할 때만 수정 된 상태를 플러시 (즉, 업데이트 SQL 쿼리를 실행)하는 것입니다. 이렇게하면 불필요한 업데이트를 피할 수 있으므로 코드가 더 효율적입니다. 첫 번째 업데이트는 두 업데이트 간의 동일한 트랜잭션에서 네이티브 SQL 쿼리를 수행하지 않는 한 불필요합니다. 왜 당신은 중간 상태가 지속되기를 원할 것입니까?

+0

+1. 모든 시간을 설명해야만하는 것을 설명해 주셔서 대단히 감사합니다 ... –

+0

네, db가 "sequence_num"열의 고유 색인을 가지고 있으므로 첫 번째 업데이트가 필요합니다. 이미 "1, 2, ... 8,9 "로 바꿔서 8과 9를 교환하고 싶습니다. 1) 8 -> 10, 2) 9 -> 8, 3) 10 -> 9 – hebing

+0

아, 그래. 그런 다음 새 값을 설정하면 세션을 플러시합니다. saveOrUpdate가 필요 없습니다. 더 쉬운 방법은이 제한을 지연 제약으로 정의하는 것입니다. 지연된 제한은 트랜잭션이 끝날 때만 검사되며 새 값이 설정 될 때마다 검사되지 않습니다. –