2011-06-01 3 views
2

Je suis un peu nouveau à hiberner et j'essaie d'implémenter la mise en cache de second niveau en utilisant ehCache. Je rencontre un problème en essayant d'utiliser le cache L2 pour récupérer une association many-to-one. La cartographie de l'association dans mon fichier foo.hbm.xml ressemble:Hibernate L2 Mise en cache pour les associations plusieurs-à-un

<hibernate-mapping> 
    <class name="com.test.Foo" table="FOO" > 
     <id name="id" type="long"> 
      <column name="FOO_ID" precision="11" scale="0" /> 
      <generator class="assigned" /> 
     </id> 

     <many-to-one name="bar" class="com.test.Bar" > 
      <cache usage="read-only" /> 
      <column name="BAR_TY" not-null="true" /> 
      <column name="BAR_VAL" length="4" not-null="true" /> 
     </many-to-one> 

    </class> 
</hibernate-mapping> 

(Ceci est très raccourci/version modifiée de mon fichier hbm.xml réel, je l'espère pas de fautes)

Notez que Je ne cache que "bar", pas "foo". Cependant, lorsque j'exécute un test unitaire avec ce mappage, j'obtiens l'erreur suivante:

SEVERE: Erreur d'analyse XML: XML InputStream (40) Le contenu du type d'élément "many-to-one" doit correspondre à "(meta *, (colonne | formule) *) ".

Lorsque je le retire, cela fonctionne très bien, mais pas de mise en cache L2. Est-ce simplement que la relation many-to-one ne supporte pas la mise en cache? Et si oui, des suggestions sur la façon de contourner cela?

FYI J'ai un autre test unitaire qui lit directement "bar" (ie pas par association) et ça fonctionne correctement - la 2ème fois que je reçois une "barre" il l'obtient du cache L2, donc je suis assez J'ai confiance que le reste de la configuration est fait correctement. Et désolé, encore à l'âge de pierre au travail donc pas annotations etc.

Répondre

0

Avez-vous essayé la définition mobile de bar dans une autre, séparée .hbm.xml et référence seulement à partir foo?

0

Votre fichier XML est mal formé. C'est le noeud <cache> à l'intérieur <many-to-one>.
Voir hibernate-mapping-3.0.dtd. Déclaration sur l'élément many-to-one:

<!ELEMENT many-to-one (meta*,(column|formula)*)> 
    <!ATTLIST many-to-one name CDATA #REQUIRED> 
    <!ATTLIST many-to-one access CDATA #IMPLIED> 
    <!ATTLIST many-to-one class CDATA #IMPLIED> 
    <!ATTLIST many-to-one entity-name CDATA #IMPLIED> 
    <!ATTLIST many-to-one column CDATA #IMPLIED> 
    <!ATTLIST many-to-one not-null (true|false) #IMPLIED> 
    <!ATTLIST many-to-one unique (true|false) "false"> 
    <!ATTLIST many-to-one unique-key CDATA #IMPLIED> 
    <!ATTLIST many-to-one index CDATA #IMPLIED> 
    <!ATTLIST many-to-one cascade CDATA #IMPLIED> 
    <!ATTLIST many-to-one outer-join (true|false|auto) #IMPLIED> 
    <!ATTLIST many-to-one fetch (join|select) #IMPLIED> 
    <!ATTLIST many-to-one update (true|false) "true"> 
    <!ATTLIST many-to-one insert (true|false) "true"> 
    <!ATTLIST many-to-one optimistic-lock (true|false) "true"> 
    <!ATTLIST many-to-one foreign-key CDATA #IMPLIED> 
    <!ATTLIST many-to-one property-ref CDATA #IMPLIED> 
    <!ATTLIST many-to-one formula CDATA #IMPLIED> 
    <!ATTLIST many-to-one lazy (false|proxy|no-proxy) #IMPLIED> 
    <!ATTLIST many-to-one not-found (exception|ignore) "exception"> 
    <!ATTLIST many-to-one node CDATA #IMPLIED> 
    <!ATTLIST many-to-one embed-xml (true|false) "true"> 

élément cache peut être placé au niveau de la classe:

<hibernate-mapping> 
    <class name="com.test.Foo" table="FOO" > 
     <cache usage="read-only" /> 
     <id name="id" type="long"> 

ou pour les collections comme set, map, bag etc.

Questions connexes