2012-12-10 4 views
1

내가 한 거래최대 절전 모드 : HQL은 데이터를로드하지 않지만, 기준은

(0)Transaction begins 
(1)Insert A into myTable 
(2)Load all data from myTable using HQL  #-> A is not loaded 
(3)Load all data from myTable using Criteria #-> A is loaded 
(4)Transaction ends 

에 다음과 같은 지침을하지만 (2)(3)를 교환하는 경우, 두 경우 모두 잘하고 A가로드를 수행합니다.

이 문제의 원인은 무엇입니까?


상세 사항 : HQL 문을 실행하지 않는 반면 여기 코드입니다 내가

@Transcational 
myFunction(){ 
    //I have A inserted into myTable and the rest... 

    SQLQuery crit = (SQLQuery) getSession().createSQLQuery("select * from myTable "); 
    ArrayList<PatternHeader> ls = (ArrayList<PatternHeader>)crit.list(); //There is no trace of A 

    Criteria cr = getSession().createCriteria(MyTable.class); 
    ArrayList<PatternHeader> crls = (ArrayList<PatternHeader>)cr.list(); // A is loaded as well 
} 
+0

실제로 SQL 쿼리는 HQL 쿼리가 아닙니다. – Atropo

+0

그래, 알아. 사실 질의는 약간 달랐지 만, 간단하게하기 위해 질의를 변경했습니다. –

답변

0

기준의 API에 대한 호출이 무엇을, 플러시를 포함한다. 아마 FlushMode가 AUTO로 설정되어있을 것입니다. 이것은 내가 이해하는 한, Hibernate로 하여금 그것이 최선이라고 생각하는 것을하도록합니다. 모든 쿼리 전에 데이터베이스와 세션을 snych하려면 항상 FlushMode를 설정하십시오.

+0

불행히도 귀하의 솔루션을 확인할 수 없었습니다. 당신의 대답을 시험하자마자 알려 드리겠습니다. BTW,'FlushMode.Always'는 어떨까요? 네가하려는 의도가 아닌가? –

+0

오. 당연하지! 내 잘못. 항상 네 친구 야. 내 대답의 편집을보십시오. – sorencito

+0

방금 ​​제안 된 솔루션을 테스트했습니다. 당신이 옳았다는 것이 밝혀졌습니다. 귀하의 답변을 편집하고 '내가 생각하기'부분을 제거하십시오. 정확히 그 시점이므로 귀하의 답변이 수락됩니다. 감사. –