Nice programing

Hibernate는 엔티티 객체의 더티 상태를 어떻게 감지합니까?

nicepro 2020. 12. 11. 19:23
반응형

Hibernate는 엔티티 객체의 더티 상태를 어떻게 감지합니까?


원래 클래스에 대한 일종의 바이트 코드 수정을 사용하고 있습니까?

아니면 Hibernate가 주어진 객체를 이전에 지속 된 버전과 비교하여 더티 상태를 얻을 수 있습니까?

내가 가진 문제에 봉착 hashCode()하고 equals()복잡한 개체에 대한 방법을. 객체에 컬렉션 멤버가 있고 순환 참조도 문제가되는 경우 해시 코드를 계산하는 것이 매우 느릴 것이라고 생각합니다.

Hibernate가 더티 상태를 확인하기 위해 hashCode()/ equals()사용하지 않는다면 , 나는 엔티티 객체 (값 객체가 아님)에 equals()/ hashCode()사용해서는 안된다고 생각 하지만, 동일한 연산자 ( ==)가 충분하지 않은 경우에도 두렵 습니다.

따라서 질문은 다음과 같습니다.

  1. Hibernate는 객체의 속성이 변경되었는지 어떻게 알 수 있습니까?

  2. 복잡한 객체에 대해 hashCode()/ equals()메서드 를 재정의 할 것을 제안 합니까? 순환 참조를 포함하면 어떻게됩니까?

    그리고 또한,

  3. 겠습니까는 hashCode()/ equals()단지와 id필드 충분?


Hibernate는 Inspection 이라는 전략을 사용하는데 , 이것은 기본적으로 이것입니다 : 객체가 데이터베이스에서로드 될 때 그 스냅 샷은 메모리에 보관됩니다. 세션이 플러시되면 Hibernate는 저장된 스냅 샷을 현재 상태와 비교합니다. 서로 다른 경우 개체는 더티로 표시되고 적절한 SQL 명령이 대기열에 추가됩니다. 객체가 여전히 일시적인 경우 항상 더럽습니다.

출처 : Hibernate in Action (부록 B : ORM 구현 전략)

그러나 Hibernate의 dirty-checking은 equals / hascode 메소드와 무관하다는 것을 알아 두는 것이 중요합니다 . Hibernate는 이러한 메소드를 전혀 보지 않습니다 (java.util.Set를 사용하는 경우를 제외하고 이것은 더티 검사와는 관련이 없으며 Collections API에만 해당됩니다) 앞서 언급 한 상태 스냅 샷은 값의 배열과 유사합니다. 이러한 프레임 워크의 핵심 측면을 개발자의 손에 맡기는 것은 매우 나쁜 결정입니다 (솔직히 말해서 개발자는 더티 검사에 신경 쓰지 말아야합니다). 말할 필요도없이 equals / hascode는 필요에 따라 여러 가지 방법으로 구현할 수 있습니다. 인용 된 책을 읽는 것이 좋습니다. 저자는 equals / hascode 구현 전략을 논의합니다. 매우 통찰력있는 독서.


Hibernate 기본 더티 검사 메커니즘 은 현재 연결된 모든 엔티티의 매핑 된 모든 속성을 초기 로딩 시간 값과 일치시킵니다.

다음 다이어그램에서이 프로세스를 더 잘 시각화 할 수 있습니다.

기본 자동 더티 검사


Hibernate는 엔티티의 더러움을 확인하기 위해 필드 별 검사를 수행합니다.

따라서 hashCode / equals는 전혀 그림에 나오지 않습니다.

실제로 Hibernate가 수행하는 필드 별 더티 검사는 성능면에서 상당히 비용이 많이들 수 있습니다.

따라서 동일한 처리를 위해 Strategy 또는 Interceptor.findDirty ()와 같은 인터페이스를 제공합니다.

다음 게시물은이를 완전히 최적화 하기 위한 응용 프로그램에 대한 몇 가지 아이디어와 함께 자세히 설명합니다 . http://prismoskills.appspot.com/lessons/Hibernate/Chapter_20_-_Dirty_checking.jsp


ID로 엔티티 객체를로드 / 가져온 다음 setter 메서드로 새 필드 값을 설정하고 update () 메서드를 호출하지 않고 세션을 닫으면 간단 합니다. 그런 다음 최대 절전 모드는 다른 필드에 영향을주지 않고 테이블의 변경된 값을 자동으로 업데이트합니다. 동시에 엔티티 객체가 더티 상태에 있습니다.

참고 URL : https://stackoverflow.com/questions/5268466/how-does-hibernate-detect-dirty-state-of-an-entity-object

반응형