0

これが可能かどうかはわかりませんが、JPAの基本を知っているので、可能かどうか尋ねたいです。基本的に、エンティティ ( と呼びますMyEntity) があり、その上に多数のフィールドがあります。MyEntityここで、すべて同じフィールドに加えて独自のフィールドを持つ 2 番目のエンティティが必要です。これの使用例は、これらのエンティティのアーカイブです。アーカイブされたすべてのエンティティを別のテーブルに保存して、MyEntityすべてのクエリをarchived=false. の JPA アノテーションは次のMyEntityようになります。

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE")
public abstract class MyEntity
{
    ....

この抽象クラスを拡張する複数のクラスがあり、それぞれに@DiscriminatorValue注釈が付いています

アーカイブされたエンティティ ( MyArchivedEntity) については、次のようなものが必要です。

@Entity
public class MyArchivedEntity
{
    private MyEntity entity;
    private String archiveSpecificField;
    ....

MyEntityもちろん、これの問題は、テーブルに参加して、フィールドMyEntityに入力するための特定のレコードを取得したいということです。そのエンティティ ( ) からこのエンティティ ( ) にentity同じフィールド/列を取得するために、ある種の注釈または何かできることはありますか?MyEntityMyArchivedEntity

最初に言ったように、これが可能かどうかはわかりませんが、達成しようとしていることの最終目標を十分に説明して、それを達成する何らかの方法があることを願っています. 違いがある場合は、EclipseLink で PostgreSQL を使用しています。

4

2 に答える 2

1

できることは、と@MappedSuperclassの両方のスーパー クラスになる AbstractParentEntityで使用することです。したがって、次のようなものになります。MyEntityMyArchiveEntity

@MappedSuperclass
public abstract class AbstractParentEntity {
    public String someField;
    ...
}

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE")
public abstract class MyEntity extends AbstractParentEntity 
{
   //here you don't have any field (they all move to  AbstractParentEntity
   // (or, at least all the fields that need to be archivied are now declared in parent class)
   ....
}

@Entity
public class MyArchivedEntity extends AbstractParentEntity  
{
    private String archiveSpecificField;
    ....

MappedSuperclass の詳細はこちら:

マッピングされたスーパークラスの継承により、継承がデータ モデルに存在しない場合でも、オブジェクト モデルで継承を使用できます。クラス継承ごとのテーブルに似ていますが、クエリ、永続化、またはスーパークラスへの関係は許可されません。その主な目的は、そのサブクラスがマッピング情報を継承できるようにすることです。サブクラスは、テーブル、ID、およびその他の情報の定義を担当し、継承されたマッピングを変更できます。マップされたスーパークラスの一般的な使用法は、アプリケーションに共通の PersistentObject を定義して、id やバージョンなどの共通の動作とマッピングを定義することです。マップされたスーパークラスは通常、抽象クラスにする必要があります。マップされたスーパークラスはエンティティではありませんが、代わりに @MappedSuperclass アノテーションまたは<mapped-superclass>要素によって定義されます。

于 2013-02-27T13:59:48.040 に答える
0

EclipseLinkの履歴サポートを調べることをお勧めします。履歴アーカイブテーブルを自動的に維持できます。

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Historyを参照して ください。

別のオプションは、orm.xmlを使用して別の永続性ユニット内の同じクラスをアーカイブテーブルにマップすることです。

于 2013-02-27T15:17:39.730 に答える