당신이/업데이트 개체를 삭제하면 알림이 전송됩니다 해당 가구의 객체를 축출하기 위해 다음과 같은 코드를 사용할 수 있습니다 변경 사항을 반영하기 위해 캐싱 레이어.
캐시 키는 다른 서버에 브로드 캐스트 될 수도 있으므로 관련 항목을 플러시하기에 충분한 원격 엔드 정보를 제공하기에 충분한 페이로드를 전달해야합니다. 그러나 다른 한편으로는 처리량을 최대화하기에는 너무 클 수 없습니다. 당신은 디버깅을하는 경우
, 당신은 (그것이 당신의 영속 객체 유형, 식별자에 따라 달라질 수 있습니다 - 합성 여부 등)에 다음과 같은 구조를 볼 수 있습니다 :
cacheKey = {org.hibernate.cache.CacheKey}
|- key = {your.own.serializable.class}
|- type = {org.hibernate.type.ComponentType}
| |- typeScope = {org.hibernate.type.TypeFactory$TypeScopeImpl}
| | |- factory = {org.hibernate.impl.SessionFactoryImpl}
| |- propertyNames = {...}
| |- propertyTypes = {...}
| |- propertyNullability = {...}
| |- propertySpan = 2
| |- cascade = {...}
| |- joinedFetch = {...}
| |- isKey = true
| |- tuplizerMapping = {...}
|- entityOrRoleName = {java.lang.String} "my.Entity"
|- entityMode = {org.hibernate.EntityMode}
|- hashCode = 588688
당신이 볼 수 있듯이, Hibernate 캐시 키는 클래스 이름, id 타입 등에 관한 정보를 저장한다. 두 가지 타입이 있다면, 두 개의 서로 다른 캐시 키에 매핑되어 문제가된다.
두 엔터티에 대해 DAO 클래스를 만들 수 있으며 해당 엔터티를 유지하기위한 모든 호출이 해당 엔터티와 다른 곳을 통해서만 진행되도록 할 수 있습니다. 그런 다음 두 항목 모두의 update
/delete
메소드에서 단순히 다른 엔티티를로드하고 제거하십시오.
다른 옵션은 interceptors을 사용하여 동일한 기능을 달성하는 데 도움이되지만 DAO 경로가 더 깨끗합니다.
사실 나는 모든 엔티티와 테이블에 대한 완전한 지식을 가지고 있기 때문에 Hibernate가 이것을 자동으로 (버그?)해야한다고 생각합니다. –
많은 사람들은 hibernate가 엔티티 대신에 원시 데이터를 캐시해야한다고 제안하지만, 캐시 리스팅은 캐시 된 행이 아닌 엔티티를 포함합니다. – androdevo