我对hibernate有些陌生,正在尝试使用ehCache实现二级缓存。我在尝试使用二级缓存检索多对一关联时遇到了一个问题。我的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"时,它从二级缓存中得到,所以我很有信心我已经正确完成了其余的配置。很抱歉,仍然处于石器时代,所以没有注释等。
您是否尝试将bar
的定义移动到另一个单独的.hbm.xml
中,并仅从foo
中引用它?
您的XML格式不正确。<many-to-one>
中的节点<cache>
是非法的
请参阅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">
或用于set
、map
、bag
等集合。