2013-08-11 2 views
4

직장에서는 Hibernate가 데이터 레이어를 처리하는 RESTful 애플리케이션을 개발 중이다. 하지만 엔티티에 대한 업데이트를 처리하는 방법을 잘 모릅니다.RESTful 애플리케이션에서 낙관적 잠금

1) 클라이언트 ID로있는 DTO에 복사됩니다
2) 최대 절전 모드로드 엔티티 버전과 항상 요청 필드() 엔티티를 요청 : 우리는 다음을 수행 할 계획입니다

JSON으로 변환하여 클라이언트에 전송
3) 클라이언트는 일부 필드를 관리하고 버전 번호가있는 엔터티를 서버로 다시 보냅니다.
4) 서버가 DTO로 변환 된 JSON을 수신합니다.
5) 대응하는 엔티티가 Hibernate로부터로드되고 DTO의 props가 엔티티로 복사된다.

=> 엔티티는 클라이언트의 버전 번호가 설정되어 있어도 항상 덮어 씁니다. 이것은 우리가 항상 Hibernate가 이것을하는 대신 스스로로드 된 인스턴스의 버전 번호에 대해 클라이언트의 버전 번호를 확인해야한다는 것을 의미합니까?

세션이있는 일반 응용 프로그램에서는 분리 된 인스턴스가 HttpSession에 저장됩니다. 클라이언트가 엔터티를 업데이트 할 때마다 인스턴스가 HttpSession에서 검색되고 일부 특성이 업데이트됩니다. Hibernate가 업데이트를 커밋 할 때마다 버전 번호가 < 인 경우 ObjectStaleException이 던져 질 것이다.

여기서 문제는 우리가 RESTful이 되려고하고 있기 때문에 Http 세션이 없다는 것입니다.

스스로 버전 번호를 확인하는 대신 RESTful 응용 프로그램에서 낙관적 잠금을 처리하는 일반적인 솔루션이 있습니까?

답변

2

당신의 전략은 좋습니다. 클라이언트에서 들어오는 버전 번호를로드 된 엔티티에 복사하거나 (동일하게 사용하는 merge()을 사용), Hibernate가 엔티티를 플러시 할 때 버전 번호가 증가하면 낙관적 인 잠금 예외가 생깁니다.

직접 확인하지 않아도됩니다. Hibernate는 당신을 위해 검사를 수행한다.

+1

Hibernate 스펙에 따르면,로드 된 오브젝트의 버전 번호를 변경할 수 없습니다. 그래서 내가 변경된 엔티티 (이전 버전 번호)를 나타내는 새로운 인스턴스를 생성 한 다음로드 된 엔티티와 병합해야 할 것 같아요? 그러나 병합 부분 업데이트의 경우 일부 필드를 null로됩니다 ... 나는 아직도 이것을 처리하는 방법을 잘 모르겠습니다. – user2054927

+0

그것은 merge가하는 일입니다. 분리 된 엔티티의 상태를 버전을 포함하여 첨부 된 상태로 복사합니다. 그렇지 않으면 낙관적 인 잠금 장치가 완전히 깨지게됩니다. 명시 적으로 버전을 설정하거나 병합을 사용하면 동일한 효과가 나타납니다. 문서가 의미하는 것은 인위적으로 값을 증가시키기 위해 버전 번호를 변경하면 안된다는 것입니다 (예외가 발생하면 예외를 발생 시키거나해야 할 때 발생시키지 않기 때문에). –

+0

이것을 위해 saveOrUpdate()를 사용할 수 있습니까? – user2054927

관련 문제