2011-05-20 2 views
12

J'ai code comme:cache Hibernate pour objet mappedBy

@Entity 
@Table(name = "A") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class A 
{ 
    @OneToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER, mappedBy="a") 
    public B getB() {}; 
} 

@Entity 
@Table(name = "B") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class B 
{ 
    @OneToOne(cascade={}, fetch=FetchType.LAZY) 
    @JoinColumn(name="A_ID") 
    public A getA() {}; 
} 

chaque fois que A est chargé il y a requête pour B. Pourquoi A.getB() n'est pas mis en cache après le chargement de A et est-il possible de le mettre en cache?

+1

Comment vous chargez 'A'? Montrez-nous le code. – skaffman

+0

comme: getEntityManager(). Find (A.class, id); – Dainius

+0

en utilisant hibernate-2.1.8 et hazelcast pour la mise en cache – Dainius

Répondre

2

Solution qui travaillent pour moi est de créer méthode supplémentaire avec @OneToMany

@OneToMany(cascade={}, fetch=FetchType.EAGER, mappedBy="a") 
public Set<B> getBSet() {}; 

@Transient 
public B getB() { return b.iterator().next(); } 

Je ne suis pas très satisfait de cette solution, mais cela fonctionne et je ne peux pas trouver d'autre moyen.

0

Essayez également de mettre l'annotation @Cache sur getB() getter. Mes observations sont que si vous mettez en cache l'objet, ses associations peuvent ne pas être considérées comme mises en cache.

+0

Cela ne fonctionne pas. J'ai également essayé de regarder en cache pour cet objet et il semble qu'il n'y ait pas de valeur pour ce champ. – Dainius

0

Cela peut être un peu plus de travail, mais vous pouvez essayer de faire le fetchType Lazy, et faire la récupération de B explicitement. De cette façon, vous pouvez vérifier si l'instance de B a déjà été chargée ou non?

Sur une note de côté, avez-vous vu ce post? Je pense que le problème est similaire:

https://forum.hibernate.org/viewtopic.php?p=2378461

Questions connexes