【问题标题】:Hibernate L2 Caching for many-to-one associations用于多对一关联的 Hibernate L2 缓存
【发布时间】:2011-09-06 05:33:02
【问题描述】:

我对休眠有点陌生,正在尝试使用 ehCache 实现二级缓存。尝试使用 L2 缓存检索多对一关联时遇到问题。我的 foo.hbm.xml 文件中的关联映射如下所示:

<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 文件的一个非常缩短/修改过的版本,希望其中没有错误)

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

严重:解析 XML 时出错:XML InputStream(40) 元素类型“多对一”的内容必须匹配“(meta*,(column|formula)*)”。

当我取出它时,它工作正常,只是没有 L2 缓存。 仅仅是多对一的关系不支持缓存吗?如果是这样,关于如何解决这个问题的任何建议?

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

【问题讨论】:

    标签: hibernate second-level-cache many-to-one


    【解决方案1】:

    您的 XML 格式不正确。 &lt;many-to-one&gt; 内部是非法节点 &lt;cache&gt;
    hibernate-mapping-3.0.dtd。关于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">  
    

    缓存元素可以放在类级别:

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

    或用于setmapbag 等集合。

    【讨论】:

      【解决方案2】:

      您是否尝试过将 bar 的定义移动到另一个单独的 .hbm.xml 并仅从 foo 引用它?

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 1970-01-01
        • 2017-05-12
        • 1970-01-01
        • 2015-01-26
        • 1970-01-01
        • 1970-01-01
        • 2013-06-27
        • 2013-02-10
        相关资源
        最近更新 更多