1

次のコンスタレーションがあります: B1.xsd と B2.xsd は両方とも A.xsd をインポートします。maven-hyperjaxb3-pluginを使用して、B1.xsd と B2.xsd の両方に JPA アノテーションを付けた Java クラスを作成しました。したがって、A.xsd のクラスは B1.xsd のプロジェクトに作成され、B2.xsd のプロジェクトにも作成されます。この 2 セットのクラスを 1 つの永続化ユニットで使用するために、外部 jaxb-Binding で @java.persitence.Table を編集する に示すように、jaxb 外部バインディングを介して各エンティティのデータベース スキーマを設定します。

問題は、wildfly にデプロイした後、wildfly がorg.hibernate.DuplicateMappingException: duplicate import: B1_ClassName refers the both B1_ClassName and B2_ClassName (auto-import=\"false\" を使用してみてください) をスローすることです

だから私がする必要があるのは、jaxb 外部バインディングを介して Entity アノテーションの name パラメータを編集することです。

@XmlRootElement(name = "B1_Element1")
@Immutable
@Cacheable(true)
@Entity(name = "B1_Element1")
@Table(name = "B1_Element1")
public class B1_Element1
    implements Serializable, Equals, HashCode, ToString
{
...
}

のようになります

@XmlRootElement(name = "B1_Element1")
@Immutable
@Cacheable(true)
@Entity(name = "PACKAGE_NAME.B1_Element1")
@Table(name = "B1_Element1")
public class B1_Element1
    implements Serializable, Equals, HashCode, ToString
{
...
}

私の実際のbindings-xjc.xjbは次のようになります

<jaxb:globalBindings localScoping="toplevel">
    <xjc:serializable />
</jaxb:globalBindings>

<jaxb:bindings schemaLocation="B1.xsd"
    node="/xs:schema">

    <hj:persistence>

        <hj:default-generated-id name="Hjid">
            <orm:generated-value strategy="IDENTITY" />
        </hj:default-generated-id>

        <hj:default-entity>
            <orm:table schema="B1_database_schema" />
        </hj:default-entity>

    </hj:persistence>

    <jaxb:schemaBindings>
        <jaxb:package name="b1.package.name" />
    </jaxb:schemaBindings>

</jaxb:bindings>

@java.persitence.Entity の name パラメータを編集する方法を知っている人はいますか?

4

1 に答える 1

0

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

答えは、これをカスタマイズする必要はないということです。つまり、これをカスタマイズする必要がある場合は、何かが間違っています。

あなたが直面している問題はA.xsd、おそらく異なるパッケージで、スキーマに対して 2 セットのクラスを生成するためです。これは、カメレオン スキーマ (A.xsdターゲット名前空間がない) がある場合、または と があるために 2 回コンパイルした場合に当てはまりB1.xsdますB2.xsd

A.xsd正しい解決策は、 2 回コンパイルしないことです。カメレオン スキーマがないことを願っています (これは JAXB の非常に悪い設計パターンです)。この場合A.xsdB1.xsdと をB2.xsd一緒にコンパイルすることも、すべてを個別にコンパイルすることもできます。最初にコンパイルA.xsdして、B1 と B2 のエピソードとして使用できます。仕組みについては、エピソードの使用を参照してください。

いずれにしても、A.xsdクラスごとに異なるパッケージを作成しないでください。

特定の質問に答えるには、複雑な型を次のようにカスタマイズしてみてください。

<hj:entity name="MyUniqueName"/>

これは、自動生成された名前をオーバーライドする必要があると思います。しかし、それは行くべき道ではありません。

ps。エピソードのテスト プロジェクトは次のとおりです。

https://github.com/highsource/hyperjaxb3/tree/master/ejb/tests/episodes

于 2015-11-09T10:39:25.470 に答える