8

Estoy intentando almacenar en caché un objeto en la memoria caché de segundo nivel de Hibernate que tiene un identificador compuesto asignado en mi archivo de asignación de persistencia. Los registros dicen que la primera vez que ejecuto la consulta, la clase mapeada como identificador compuesto se coloca en el caché. Sin embargo, cuando ejecuto la consulta por segunda vez, el objeto no se extrae de la memoria caché. En su lugar, ejecuta la consulta de nuevo.Id. De compilación de segundo nivel de caché de Hibernate

¿Hibernate tiene un problema con los identificadores compuestos de almacenamiento en caché de segundo nivel?

información relevante:

  1. usando Hibernate 3.1, 2.4.2 ehcache
  2. clase Identificación Compuesto implementa serializable
  3. estoy usando una nueva sesión de hibernación cuando se ejecuta la consulta por segunda vez
  4. I estoy usando hibernateTemplate.load (Class, ID) para recuperar el objeto

Así es como estoy construyendo mi I D y la ejecución de mi consulta:

CompositeId id = new CompositeId(date, sessionId); 
UserDetails user = (UserDetails) hibernateTemplate.load(UserDetails.class, id); 

Y así es como mi archivo persistencia de mapeo define lo anterior:

<class name="com.entities.UserDetails" 
     table="USER_DETAILS" 
     lazy="false"> 
    <cache usage="read-write"/> 

    <composite-id name="userId" class="com.entities.CompositeId" unsaved-value="undefined"> 
     <key-property name="userSessionId" column="SESSION_ID" /> 
     <key-property name="dateCreated" column="DATE_CREATED" type="date" /> 
    </composite-id> 

EDIT: La trama se complica ....

Cuando cambié este a la política de caché de solo lectura, funcionó bien. El comportamiento del caché transaccional parece ser extremadamente impredecible. ¿Alguien puede explicar por qué sucedió lo anterior con un caché de lectura y escritura, pero que funcionó bien con solo lectura? Esta tabla no se actualiza, por lo que no estoy seguro de por qué la semántica transaccional podría cambiar las cosas en esa instancia.

+0

¿Su clase de identificación compuesta ha implementado correctamente 'equals()'/'hashCode()'? – axtavt

+0

Sí, lo siento, debería haber agregado eso también. Implementa ambos. – sma

+0

¿Son tanto la identificación compuesta como la entidad serializable? – Augusto

Respuesta

0

Parece que se ha informado bug with Hibernate. Parece que, como solución alternativa, puede poder presionar correctamente la memoria caché si utiliza la misma instancia de la clave compuesta, en oposición a la que es .equals().

También hay un parche en el informe de fallos, quizás podría aplicarlo usted mismo y desplegar su propia versión de Hibernate parcheada.

Cuestiones relacionadas