2013-02-25 5 views
7

나는 다음과 같은 코드를 가지고 :쿼리 하이버 네이트 캐시

Person a = new Person(); 
a.setName("John"); 

Session session = openHibernateSession(); 

session.beginTransaction(); 

session.saveOrUpdate(a); 

Criteria critera = session.createCriteria(Person.class); 
critera.add(Restrictions.eq("name","John")); 
Person personFromCache = (Person) criteria.uniqueResult(); 

... 

session.commit(); 

내가 원하는 것은 데이터베이스 및 최대 절전 모드의 캐시 모두에서 개체를 검색 할 수있는 기능을 가지고있다. 다음 예제에서는 uniqueResult을 호출 할 때 null을 반환합니다. 아직 데이터베이스에 커밋되지 않은 저장된 개체를 검색 할 수있는 방법이 있습니까?

답변

1

ID가 아닌 다른 값을 검색하는 경우 Hibernate는 1 차 레벨 캐시를 사용하지 않습니다. Hibernate get과 load는 기본적으로 첫 번째 레벨 캐시와 관련이 있지만 criteria 쿼리는 그렇지 않습니다. 귀하의 경우에는하는 동안 세션의 데이터를 따라서 이드 GE가 생성됩니다 데이터베이스 및 결과 기준 쿼리로 동기화 할 수 있도록 세션 = 그냥이 session.flush(); 같은 세션을 세척 세척하여 내 옆

  1. 에서 두 가지 해결책이 있습니다 것입니다 결과를 데이터베이스에서 찾으면 목록이 생성됩니다.

  2. 최대 절전 모드 사용 2 단계 캐시 = ehCache와 같은 최대 절전 모드 캐시를 사용하여 2 차 캐시를 활성화하고 트릭을 적용 할 수 있습니다.

0

당신은 StatelessSession을 사용할 수 있지만 경고 : 그 entitys 어떤 세션에 바인딩되지 않습니다 그리고 당신은 관계 또는 게으른 필드를 해결하기 위해 좋아하는 경우에 당신은 예외를 얻을 것이다!

0
session.beginTransaction(); 

session.saveOrUpdate(a); 

session.flush(); 

Criteria critera = session.createCriteria(Person.class); 
critera.add(Restrictions.eq("name","John")); 
Person personFromCache = (Person) criteria.uniqueResult(); 
0

우리는 TestNg 테스트 프레임 워크를 사용하는 것을 제외하고는 몇 가지 유사한 작업을 수행합니다. 몇 가지 답변에서 session.flush() 메서드 호출에 대해 설명합니다. 이 말이 맞습니다. flush에 대한 호출은 Hibernate에게 현재 대기열에서 대기중인 모든 데이타베이스 호출이 실행되고 대기열에서 지워지는 것을 포함하여 몇 가지 작업을 수행하도록 지시합니다.

0

사용자 이름을 기준으로 선택하더라도 데이터를 반환합니다. 널 (null)을 리턴하지 않습니다.