免責事項 #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 を追加できますが、多くは作成できません。私のタイプへの他の構造的な変更。
前もって感謝します!