0

列挙制約を持つ要素を含む xsd ファイルがあります。

<xs:complexType name="Request">
    <xs:sequence>
        <xs:element name="CommsAddress" type="xs:string" />
        <xs:element name="CommsAddressType">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="EMAIL"/>
                    <xs:enumeration value="PHONE"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        ...

生成された Java クラスのフィールドを、値とCommsAddressTypeを持つ生成された列挙型にしたいと思います。次に、Hibernate に、値との 2 つの行を含むテーブルを含むデータベース スキーマを自動的に生成してもらいたいと考えています。その後、テーブルはこれらを列で簡単に参照できます。EMAILPHONECommsAddressTypeEMAILPHONERequestCommsAddressTypeId

現在、Hyperjaxb3は type のフィールドをRequest持つ私のクラスを生成します:CommsAddressTypeString

@XmlElement(name="CommsAddressType")
protected String commsAddressType

Requestまた、テーブルCommsAddressTypeに type の列が含まれるようにスキーマが生成されますVARCHAR。これにより、不要な重複データが大量に発生することは明らかです。

私が上で説明したことを達成する方法はありますか?また、xsd を顧客に公開しているため、可能であればスキーマに jaxb または hyperjaxb タグを含めないようにしたいと考えています。

4

1 に答える 1

0

免責事項:私はHyperjaxbの作成者です。

列挙型を Java で列挙型にすると、Hyperjaxb はそれらを文字列ではなく列挙型として処理します。このために、たとえば、単純な型を次のようにカスタマイズできます。

<jaxb:typesafeEnumClass/>

このを参照してください。

Hyperjaxb は、対応するプロパティを としてマップします@Enumerated

いいえ、ルックアップ テーブルを生成することはできませんが、データベースでの列挙型のマッピング方法をカスタマイズできます。たとえば、次のようにマッピングできますEnumType.ORDINAL

<hj:basic><orm:enumerated>ORDINAL</orm:enumerated></hj:basic>

実際、列挙型を使用すると、JPA のルックアップ テーブルは実際には必要ありません。JPA は、指定されたマッピングに従って列挙型を正しくEnumTypeマッピングします。

ただし、結合されたクエリで人間が読み取れる値を生成できるようにするなど、独自の目的のためにルックアップ テーブルが必要になる場合があります。

この場合、enum を次のようにマッピングしORDINAL、ルックアップ テーブルと対応する外部キーを独自の DDL スクリプトに追加することをお勧めします。

はい、説明したすべてのカスタマイズを別のバインディング ファイル (通常はbindings.xjb) で行うことができます。スキーマで直接行う必要はありません。ここでテストプロジェクトを参照してください。たくさんの例があります。ディレクトリ内の*.xjbファイルを探すだけです。src/main/resources

于 2015-10-28T10:18:00.353 に答える