1

免責事項 #1: 私は XSD、データベース、および JPA にかなり慣れていないため、私の質問は無意味かもしれません。

XSD を介して指定されたインターフェイスがあります。XML ドキュメントを受け取り、その内容をリレーショナル データベースに保存する必要があります。XSD を変更する能力は限られています。インターフェイス自体は、複雑な関係を持つ多数のエンティティで構成されています。XML ドキュメントで完全なオブジェクト グラフを要求することが望ましくない場所が多数あります。

基本的に、私の XSD は現在次のようになっています。

<xsd:schema 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
     xmlns:hj="http://hyperjaxb3.jvnet.org/ejb/schemas/customizations"     
     xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"                                                       
     xmlns:ns1="urn:foo"
     targetNamespace="urn:foo" elementFormDefault="qualified" jxb:version="2.0"
     jxb:extensionBindingPrefixes="hj orm">
     <xsd:complexType name="Foo">
        <xsd:sequence>
            <xsd:element name="fooId" type="xsd:string" nillable="false">
                <xsd:annotation>
                    <xsd:appinfo>
                        <hj:id />
                    </xsd:appinfo>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="Bar">
        <xsd:sequence>
            <xsd:element name="BarId" type="xsd:string" nillable="false">
                <xsd:annotation>
                    <xsd:appinfo>
                        <hj:id />
                    </xsd:appinfo>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="associatedFoo" type="xsd:string" nillable="false">
            </xsd:element>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="Baz">
        <xsd:sequence>
            <xsd:element name="BazId" type="xsd:string" nillable="false">
                <xsd:annotation>
                    <xsd:appinfo>
                        <hj:id />
                    </xsd:appinfo>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="associatedFoos" type="xsd:string" nillable="false" minOccurs="0" maxOccurs="unbounded">
            </xsd:element>
        </xsd:sequence>
     </xsd:complexType>
</xsd:schema>

その XSD を hyperjaxb3 (0.5.6) で実行し、Foo、Bar、および Baz の Java クラスのセットを取得します。私が望むのは、結果の DB スキーマで、Bar.associatedFoo と Baz.associatedFoos がすべて実際の fooId であることを要求することです。ただし、たとえば bar.associatedFoo がタイプ ns1:Foo になるようにスキーマを更新することはできません。それで、問題は次のとおりです。どうすればそれを行うことができますか?

ここでの理由は、XSD の各型は、実際には大規模で複雑な、相互に関連するオブジェクト グラフだからです。Baz の XML 文書に、それぞれの Foo の完全な XML 表現を含める必要はありません。

(明らかに、1 つのオプションは、JPA スキーマの作成後に手動で DB 制約を手動で追加することですが、可能であれば、この情報を XSD に埋め込むことをお勧めします。)

単純なケース (Bar.associatedFoo) では、orm:column アノテーションを使用して、列の定義を直接変更できます。

<hj:basic>
    <orm:column column-definition="VARCHAR(255) REFERENCES myschema.Foo"/>
</hj:basic>

しかし、(a) この試みを Baz.associatedFoos のケースに拡張する方法がわかりません。(b) 可能であれば壊れにくいものを好みます (列定義文字列は、foo id の長さが変更されるたびに微調整する必要があります。スキーマ名の変更、または Foo のテーブル名の変更; CREATE TABLE foo の前に CREATE TABLE Bar を決定する JPA に依存し、実行時までエラーは生成されません)。

問題があれば、JPA 実装として openJPA 2.1.1 を使用し、DB として Postgres 9.1 を使用しています。XSD では、必要に応じて ID 定義を変更し (complexType にするか、xsd:string の名前付きエイリアスにするか、その他の変更を加えることができます)、好きな xsd:annotations を追加できますが、多くは作成できません。私のタイプへの他の構造的な変更。

前もって感謝します!

4

0 に答える 0