2

此页面建议!ENTITY:

如果要避免重复,请考虑使用 XML 实体(例如,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>)?

4

1 回答 1

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

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

于 2012-07-16T00:50:03.423 回答