8

J'essaie de mettre en cache un objet dans le cache de second niveau de Hibernate qui a un ID composite mappé dans mon fichier de mappage de persistance. Les journaux indiquent que la première fois que j'exécute la requête, la classe est mappée lorsque l'ID composite est placé dans le cache. Toutefois, lorsque je réexécute la requête, l'objet n'est pas extrait du cache. Il exécute à nouveau la requête à nouveau.Cache-Hibernate cache-id de second niveau

Est-ce que Hibernate a un problème avec les ID composites de mise en cache de second niveau?

Infodesks:

  1. utilisant Hibernate 3.1, ehcache 2.4.2
  2. classe ID Composite implémente sérialisable
  3. J'utilise une nouvelle session de mise en veille prolongée lors de l'exécution de la requête une deuxième fois
  4. I J'utilise hibernateTemplate.load (Class, ID) pour récupérer l'objet

Voici comment je construis mon I D et exécuter ma requête:

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

Et voici comment mon dossier persistance mapping définit ci-dessus:

<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: L'intrigue épaissit ....

Quand j'ai changé cette à la politique de cache en lecture seule, cela a bien fonctionné. Le comportement du cache transactionnel semble extrêmement imprévisible. Quelqu'un peut-il expliquer pourquoi ce qui précède est arrivé avec un cache en lecture-écriture, mais a bien fonctionné en lecture seule? Cette table n'est pas mise à jour, donc je ne sais pas pourquoi la sémantique transactionnelle changerait les choses dans cette instance.

+0

Votre classe d'ID composite a-t-elle correctement implémenté 'equals()'/'hashCode()'? – axtavt

+0

Oui, désolé, j'aurais dû ajouter cela aussi. Il implémente les deux. – sma

+0

L'identificateur composite et l'entité Serializable sont-ils tous les deux? – Augusto

Répondre

0

Cela ressemble à bug with Hibernate. Semble que, comme une solution de contournement, vous pouvez être en mesure d'atteindre avec succès le cache si vous utilisez la même instance de votre clé composite, par opposition à celui qui est .equals().

Il y a aussi un patch sur le rapport de bogue, vous pouvez peut-être l'appliquer vous-même et lancer votre propre build Hibernate patché.

Questions connexes