2011-06-01 45 views
2

我对hibernate有点新,并试图使用ehCache实现二级缓存。尝试使用L2高速缓存来检索多对一关联时遇到问题。在我foo.hbm.xml文件的关联映射是这样的:对于多对一关联的休眠L2缓存

<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> 

(这是我的实际hbm.xml文件中的一个很短/修改后的版本,它希望没有错误)

注意我只缓存“酒吧”,而不是“富”。但是,当我使用此映射运行单元测试时,出现以下错误:

SEVERE:解析XML时出错:XML InputStream(40)元素类型“多对一”的内容必须匹配“(meta * (列|式)*)”。

当我拿出它工作正常,只是没有L2缓存。 难道多对一关系不支持缓存吗?如果是这样,有什么建议如何解决这个问题?

仅供参考我有另一个直接读取“bar”(即不通过关联)的单元测试,它能正常工作 - 第二次我得到一个“bar”它从L2缓存中获取它,所以我相当公平相信我已经正确完成了其余的配置。对不起,仍然在工作中的石器时代,所以没有注释等。

回答

0

您是否试过将bar的定义转换为另一个独立的.hbm.xml,并且仅从foo引用?

0

您的XML格式错误。 <many-to-one>内部是非法节点<cache>
hibernate-mapping-3.0.dtd

<!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"> 

缓存元件可以被放置在类级别:many-to-one元件上声明bag

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

或像set集合,map