2

このページは !ENTITY を提案します:

重複を避けたい場合は、XML エンティティの使用を検討してください (たとえば、DOCTYPE 宣言の [ ] とマッピングの %allproperties; など)。

問題は、Web 上のどこにも完全に機能する例が見つからないことです。

私がこれまでに得たものは次のとおりです。

<!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;( my <class>and内<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 に答える