冬眠!ENTITY

时间:2012-06-12 13:17:45

标签: java hibernate

This page建议!ENTITY:

  

如果您想避免重复,请考虑使用XML实体(for   例如,[]中   DOCTYPE声明和%allproperties;在映射中。)

问题在于我无法在网络上的任何地方找到完整的工作示例。

到目前为止我得到的是:

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"
        [ <!ENTITY allproperties SYSTEM "allproperties.xml"> ]
        >

..但其余的呢? 1.我如何在allproperties.xml文件中定义属性? 2.我如何/在哪里确实包含%allproperties;关键字(在我的<class><union-class>中)?

1 个答案:

答案 0 :(得分:3)

这是一个称为实体包含的基本XML构造。名为'allproperties.xml'的文件将包含实体的属性映射片段。例如:

<property name="name".../>
<property name="someOtherProperty".../>
<!-- rest of shared property definitions -->

然后在映射文件中你会说:

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" [ 
    <!ENTITY allproperties SYSTEM "allproperties.xml"> ]>

<hibernate-mapping>
    <class name="Class1" ...>
        <id .../>
        &allproperties;
    </class>
    <class name="Class2" ...>
        <id .../>
        &allproperties;
    </class>
</hibernate-mapping>

我在这里定义了每个类中的<id/>映射,但如果信息完全相同,您也可以将其移动到包含文件中。作为<class/>的孩子有效的任何内容都可以在包含文件中使用。

JAXP期望SYSTEM引用是相对或绝对文件引用。因此,上述意味着将相对于包含文件的系统标识符解析allproperties.xml文件。通常这可能不会很好。为此,Hibernate还了解了一个以classpath://为前缀的特殊类型的SYSTEM引用。正如您所料,它会触发引用资源的类路径资源查找。

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" [ 
    <!ENTITY allproperties SYSTEM "classpath://com/acme/allproperties.xml"> ]>

现在,将使用com / acme / allproperties.xml资源名称通过类路径查找来解析allproperties.xml。