1

エンティティ間で共通のフィールドを持つエンティティを使用して、いくつかのサービスを構築しようとしています。これを処理するために、私たちが取ったアプローチは、すべての共通フィールドを持つ基本クラスを定義し、そこから他のすべてを拡張することです。

基本クラスはマップされたスーパークラスとして定義され、派生クラスは通常のエンティティです。クラス レベルでは、エンティティは基本クラスを拡張します。

モジュールを維持するために、共通プロジェクト (Maven ベース) と、この共通プロジェクトに依存する別のプロジェクトのエンティティで基本クラスを定義しました。

問題は、マップされたスーパークラスを識別/解析しないことです。共通のマッピングを解決できません。

だから、私の質問は、私がここでやろうとしていることは何でも、それはJPAのルール/仕様に準拠していますか?

マッピングされたスーパークラスを具体的なものと同じマッピング xml で定義すると、正常に動作します。しかし、それを回避したいプロジェクトごとに繰り返す必要があります。

クラスとマッピングのコード スニペットを次に示します。

また、ここでは、共通のマップされたスーパークラスも共通の主キーを定義していることに注意してください。ID。

基本クラス:

public class BaseEntity {
    String id;
    String status;    
    Date createdDate;
    String createdBy;
    Integer versionNumber;

    //getters and setters for these fields
}

基本クラスのマッピング xml

<entity-mappings>
    <package>mypackage</package>
    <mapped-superclass class="mypackage.BaseEntity">
        <attributes>
            <id name="id">
                <column name="ID" />
            </id>           
            <basic name="status">
                <column name="STATUS"/>
            </basic>
            <basic name="createdDate">
                <column name="CREATED_DT" />
            </basic>
            <basic name="createdBy">
                <column name="CREATED_BY" />
            </basic>
            <version name="versionNumber">
                <column name="VERSION_NUMBER" />
            </version>
        </attributes>
    </mapped-superclass>
</entity-mappings>

この永続性 xml

<persistence>
    <persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <mapping-file>META-INF/jpa/CommonMappings.xml</mapping-file>
        <properties>
            <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/> 
        </properties>
    </persistence-unit>
</persistence>

これらは別の瓶にパッケージ化されています。

具体的なエンティティ

public class MyEntity extends BaseEntity {

    String name;
    String address;

    //getters and setters
}

具体的なエンティティのマッピング

<entity-mappings>
    <package>mypkg2</package>

    <entity class="mypkg2.MyEntity" name="MyEntity">                
        <table name="MYENTITY"/>

        <attributes>    
            <basic name="name">
                <column name="NAME"/>       
            </basic>

            <basic name="address">
                <column name="ADDRESS"/>        
            </basic>
        </attributes>
    </entity>

</entity-mappings>

具体的なエンティティの永続性 xml

<persistence>
    <persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <mapping-file>META-INF/jpa/MyEntityMappings.xml</mapping-file>
        <properties>
            <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/> 
        </properties>
    </persistence-unit>
</persistence>

編集:(dkaustubhの提案に基づく)

基本エンティティで注釈を使用すると機能します。派生エンティティのマッピングを XML に残しました。

ただし、マッピングの一貫性を保ち、XML を使用して定義したいと考えています。注釈では機能するのに、XML マッピングでは機能しないのはなぜですか?

4

1 に答える 1

1

基本クラスを別の jar に保持できますが、同じ persistence.xml で定義する必要があります。

マッピング xml ごとにマッピングを繰り返さないという質問に来て、基本エンティティで注釈をより適切に使用できます。このようにして、マッピング xml を繰り返す必要はありません。

于 2013-04-30T20:20:44.770 に答える