2009-12-23 6 views
0

Hibernate 트랜잭션 내에서 일부 쿼리를 실행할 때 -> mysql에서 데이터가 성공적으로 업데이트되지만 내 애플리케이션에는 여전히 오래된 값이있다. 다시 시작할 때 - Ok입니다. 자동 커밋 모드를 설정하면 잘 작동하지만 트랜잭션을 사용해야합니다 ;-). 어떤 아이디어? 미리 감사드립니다. Hibernate 트랜잭션 문제

+0

어디에 이전 값이 있습니까? 최대 절전 모드 개체에서? – rado

+0

업데이트를 어떻게 수행하고 있습니까? 2 차 캐싱을 사용하고 있습니까? 자동 커밋 모드를 사용한다고 말하면 모델을 업데이트하지만 트랜잭션을 사용할 때는 그렇지 않습니다. –

+0

예. 두 가지 방법이 있습니다 - 먼저 테이블을 업데이트하십시오. 모든 쿼리는 오류없이 실행되며 transaction.commit()이 실행 중입니다. 내가 MySQL의 쿼리 브라우저에서 선택 - 확인 (새 값). 하지만 두 번째 방법 (단지 db 행을로드하는)으로 UI를로드하면 오래된 값이 있습니다. 프로그램을 종료하고 다시 시작하면 새 값이 나타납니다 (내 UI에서) ??? – NikolayGS

답변

1

UPDATE를 사용하여 데이터베이스를 직접 조작해도 세션에 캐시 된 개체에는 영향을주지 않습니다. 세션을 지워야합니다 (Session.clear()). 뭔가 같은 : 당신이 JPA API 또는 최대 절전 모드의 기본 API를 사용하거나 hibernate에서

myobj.setName(newValue) 
session.saveOrUpdate(myobj)  
+0

그래, 나는이 일을 끝내지 못했지만, 더 많은 정보가 없으면 확실하지 않다는 느낌을 가지고있다. –

+0

그래, 근본적인 오해가있다. 두 번째 수준 캐싱은 알지 못해도 활성화 될 수 있습니다. 이 시점에서 Nikolay에게 줄 수있는 최선의 조언은 Hibernate 매뉴얼을 처음부터 끝까지 읽는 것이다 :-) –

+0

나는 하루 종일 세션/트랜잭션을 읽었다.그리고 미스터리가 해결되었습니다 ;-) 문제는 업데이트 방법이 아니라 결과를 반환하는 문제입니다. 단순히 조건을 구성하고 "uniqueResult"를 반환하지만 트랜잭션 내부에는 없었습니다. 왜 나는 여기 거래가 필요한가요? 그것은 단 하나의 선택 쿼리입니까? 도와 주신 모든 분들께 감사드립니다! – NikolayGS

0

:

session.flush() 
session.clear() 
query.executeUpdate() 

또는 더 나은, 당신은 업데이트 쿼리를 사용하여 메모리에서 개체의 상태를 조작하지 않음으로써 문제를 방지 할 수 있습니다 당신이 인터페이스 아래

  1. 기준을 사용하여 실행되는 쿼리 (최대 절전 모드 네이티브 API)
  2. 쿼리 (최대 절전 모드 네이티브 API)
  3. EntityManager의 createQuery() (JPA)

쿼리는 두 번째 수준 또는 첫 번째 레벨 캐시와 상호 작용하지 말아. 그들은 데이터베이스에 직접 충돌합니다. 쿼리가 현재 지속성 컨텍스트에있는 엔티티를 업데이트하는 경우 해당 엔티티는 변경 사항을 반영하지 않습니다. 이것은 기본 동작입니다.

엔티티의 최신 상태를 보여주기 위해 컨텍스트를 업데이트하려면 세션 또는 EntityManager에서 refresh()를 사용하여 지속성 컨텍스트의 최신 엔티티 상태를 반영하십시오. 대회는 항상 영속 컨텍스트에 데이터를로드하기 전에 DML을 실행으로

http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#refresh-java.lang.Object-

https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#refresh%28java.lang.Object%29

그렇지 않으면 더 많은 정보를 원하시면 아래의 문서를 읽어 .

희망 사항 : D