web-dev-qa-db-ja.com

JPA、同じクラス(エンティティ)を使用して異なるテーブルをマップする方法

TaTbの2つのテーブルがあります。テーブル構造はまったく同じですが、テーブル名が異なります。

テーブル構造をマップするエンティティクラスを1つ作成しようとしています。私の一般的なアプリケーションモジュールの一部は、このエンティティクラスを使用して、パラメーターに基づいてTaまたはTbを動的に照会および更新します。 JPAで実行できますか?実行時にエンティティークラスを異なるテーブルに動的にマッピングするプログラムをどのように書くことができますか?

45
John

希望どおりに正確に実行できるかどうかはわかりませんが、継承を使用して同じ結果を生成できます。

AbsTにはすべてのフィールドがありますが、@ Tableアノテーションはありません

TaとTbはAbsTから継承し、それぞれ@Tableアノテーションを持っています

使用する

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

absT。

サンプルコード:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class abstract AbsT {
    @Id Long id;
...
}

@Entity
@Table(name = "Ta")
public class Ta extends AbsT {
...
}

@Entity
@Table(name = "Tb")
public class Tb extends AbsT {
...
}
47
Glen

アノテーション@MappedSuperclassを使用して抽象クラス(テンプレートクラス)を作成し、それを拡張します。拡張する各クラスは、@ table、@ entityアノテーションを使用し、空のコンストラクタのみを含みます。すべてのコードは親クラスにあります。メソッドでジェネリックを使用して、パラメーターエンティティがtemplateClassから拡張され、コードを変更する必要がないことを示します。適切なマッピングは、あなたが渡す各息子にあります。

23
arbano

2つの異なる永続性ユニットを使用する場合、サブクラスを使用せずにこれを行うこともできます。

各永続性ユニットは、一意のマッピングセット(テーブル名を含む)を指定できます。これを実現する1つの方法は、2つのorm.xmlファイルを作成することです。 persistence.xmlでは、次のようなものが必要になります。

<persistence xmlns="http://Java.Sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="1.0">

    <persistence-unit name="mapping-1"> 
        . . .
        <mapping-file>orm-1.xml</mapping-file>
        . . .
    </persistence-unit>

    <persistence-unit name="mapping-2"> 
        . . .
        <mapping-file>orm-2.xml</mapping-file>
        . . .
    </persistence-unit>
</persistence>

次に、orm-1.xml内で:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://Java.Sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/persistence/orm orm_1_0.xsd"
    version="1.0">
    <package>mypackage</package>
    <entity name="myEntity" class="myClass">
        <table name="TABLE1">
            </table>
    </entity>
</entity-mappings>

そしてorm-2.xml内:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://Java.Sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/persistence/orm orm_1_0.xsd"
    version="1.0">
    <package>mypackage</package>
    <entity name="myEntity" class="myClass">
        <table name="TABLE2">
            </table>
    </entity>
</entity-mappings>

各PersistenceUnitに個別のEntityManagerFactoryを作成する必要があります(おそらく望んだものではありません)。ただし、異なるクラス(異なるテーブル名を持つ)で同じクラスを使用したい場合は、これが適しています。

7
Mike