2010-05-21 2 views
3

save() 또는 update() 메쏘드를 호출하기 전에 Hibernate 엔티티가 자동적으로 데이터베이스에 유지된다 (또는 적어도 캐쉬되어야 함). 나에게 이것은 아주 이상한 기본 행동이다 -하지만 오케이, 내가 그것을 해제 할 수있는 한, 괜찮아.Hibernate의 자동 영속성 전략을 변경하는 방법

내가 가진 문제는 데이터베이스의 엔티티가 상태 (상태 "1"에서 상태 "2"로)를 여전히 가져온 경우에만 내 엔티티의 상태 1"). 이는 다른 서버가이 동일한 객체를 업데이트 할 때 동시성 문제를 제거하기위한 것입니다. 이런 이유 때문에, 엔터티가 예상 상태 "1"에있는 경우에만 엔터티를 업데이트하는 사용자 지정 NamedQuery을 만들었습니다. 다음은 몇 가지 의사 코드입니다.

// Get the entity 
Entity item = dao.getEntity(); 
item.getState(); // == 1 

// Update the entity 
item.setState(2); // Here is the problem, this effectively changes the 
        // state of my entity breaking my query that verifies 
        // that state is still == 1. 

dao.customUpdate(item); //Returns 0 rows changes since state != 1. 

세터가 cache/db의 상태를 변경하지 않도록하려면 어떻게해야합니까?

+0

방법 업데이트 쿼리가 원래의 데이터를 비교할 수 있는가? 내가 아는 한 모든 쿼리는 투명하게 세션 캐시를 사용하므로 객체에서 수행 한 모든 테스트는 커밋/플러시되기 전에도 업데이트 된 상태를 볼 수 있습니다. – mdma

답변

1

Hibernate는 버전 아이디 또는 타임 스탬프를 사용하여 낙관적 인 잠금을 지원합니다. 객체를 저장하려고 시도 할 때 기본 데이터가 변경되면 최대 절전 모드에서 예외가 발생합니다. 이 예외를 잡아서 필요에 따라 처리 할 수 ​​있습니다. 업데이트를 무시하거나 다시 시도하십시오. 나는 당신의 업데이트 쿼리가 어떻게 작동하는지에 대한 명확한 아니지만, 당신이 손으로이 일을 계속하려는 경우, 당신은 그것을 불러 오는 후 세션에서 개체를 퇴거 할 수

Optimistic Concurrency Control

편집을 참조하십시오. 이렇게하면 db/cache와 독립적으로 수정할 수있는 검색 시간에 객체의 스냅 샷을 얻을 수 있습니다. 비교 업데이트의 한 측면으로 사용자 지정 업데이트 쿼리에 전달할 수 있으며, 다른 측면은 지속 된 값입니다. 쿼리가 엔티티를 선택/업데이트하면 제거 된 객체가 아니라 데이터베이스에서 다시 읽습니다. 그런 다음 업데이트 쿼리는 업데이트를 수행해야하는지 여부를 확인하기 위해 매개 변수로 전달 된 축출 된/수정 된 값과이를 비교할 수 있습니다.

Session.evict()

0

당신은 세션의 플러시 모드를 설정해야합니다 참조하십시오. 그런 식으로 세션 엔티티는 session # flush()를 실행 한 후에 만 ​​지속됩니다.

당신이 세션 캐시 또는 DB를 업데이트하려면 같은 것을 할 :

Bean bean = session.get(Bean.class, bean.getId()); 
session.setFlushMode(FlushMode.COMMIT); 
// Make some changes to bean object. 
Bean bean2 = session.get(Bean.class, bean.getId()); 
Assert.assertFalse(bean.equals(bean1)); // Assuming equals and hashcode are implemented 
관련 문제