2012-06-19 3 views
1

엔티티가 있습니다. 이 엔터티는 트랜잭션 내에서 수정됩니다. 그러나 어느 시점에서 나는 트랜잭션 중에이 엔티티에 대한 변경 사항을 알고 싶습니다. 그 이유는 엔티티에 대한 변경 사항의 차등 수출을 유발하기 위해서입니다. 나는 이미이 "솔루션"을 개발했습니다 :엔티티의 변경 사항을 추적하는 방법이 있습니까?

public void triggerExport(A a) 
{ 
    em.detach(a); 
    A result = em.find(A.class, a.internId); 

    doExport(a, result); 
    em.merge(a); 

} 

정말 이것을 수행 할 수있는 방법이 확실하지 않습니다. 이 엔터티의 각 comparsion에 대한 추가 데이터베이스 상호 작용이 발생합니다. 어떻게 생각해? 더 좋은 방법이 있습니까?

답변

0

최대 절전 모드를 사용하는 경우, 기본적으로 동일한 세션에서 반복 가능한 쿼리를 캐시하기 위해 1 차 수준 캐시를 사용합니다. Hibernate Recipes: A Problem-Solution Approach book에서

:

첫 번째 레벨 캐시는 트랜잭션 레벨 또는 작업 단위이다. Hibernate에서 기본적으로 사용 가능합니다. 첫 번째 수준의 캐시는 세션과 연결된 입니다. 동일한 쿼리가 동일한 세션에서 복수 번 실행되면 쿼리와 연결된 데이터는 으로 캐시됩니다.

세션 내에서 오브젝트를 두 번 이상 검색한다고 가정하십시오. 조회가 호출 될 때 최대 절전 모드로 데이터베이스를 으로 여러 번 쿼리합니까?

Session session = factory.openSession(); 
try { 
Book book1 = (Book) session.get(Book.class, id); 
Book book2 = (Book) session.get(Book.class, id); 
} finally { 
session.close(); 
} 

당신이 Hibernate에 의해 실행 된 SQL 문을 검사하는 경우

, 당신은 단지 하나의 데이터베이스 쿼리가 만든 것을 찾을 수 있습니다. 이것은 Hibernate가 같은 세션에서 객체를 캐싱하고 있음을 의미합니다. 이러한 종류의 캐싱은 첫 번째 레벨 캐싱이라고하며 캐싱 범위는 세션입니다.

+0

난 당신이 무슨 생각하는지 알아요,하지만 어쩌면 당신은 내가 엔티티를 분리 놓친,

보고, 전체 역사의 지원을하고 있습니다. 영속 컨텍스트에서 엔티티를 분리하는 경우 엔티티는 더 이상 트랜잭션 캐시에 있지 않습니다. 그 이유는 내가 공급자로 차이를 얻을 수있는 이유는 데이터베이스에 새 쿼리를 수행하는 데 필요합니다. –

2

나는 개인적으로 이것을 사용하지 않았지만, 최대 절전 모드와 통합 된 감사 도구 인 JBoss Envers에 관해 좋은 말을 들었다. 엔티티에 대해 변경된 사항을 감사하고 특정 변경 사항을 내보내는 데이 기능을 사용할 수 있습니다.

+0

Eclipselink를 사용하고 있습니다. ( –

3

또한 새 EntityManager를 만들고 개체를 찾을 수 있습니다. 이렇게하면 개체 분리 및 병합을 줄일 수 있습니다.

EclipseLink를 사용하는 경우 UnitOfWork 양식에서 EntityManager의 포장을 풀고 getCurrentChanges()를 호출하여 트랜잭션에서 변경된 변경 세트를 얻을 수 있습니다. 공유 캐시를 사용하는 경우 getOriginalVersionOfObject()를 사용하여 원본 객체를 가져올 수도 있습니다.

는 EclipseLink도 http://wiki.eclipse.org/EclipseLink/Examples/JPA/History

관련 문제