2016-04-08 9 views
0

私は同じクラスを表す2つのほぼ同じテーブルを持っています。唯一の違いは、2番目の表には1列ではなく2列の主キーがあることです。 id対IDとバージョン 最初のテーブルはオブジェクトの現在の状態を表し、2番目のテーブルはトリガを介して保持されている完全な履歴を含んでいます(おそらく、トリガは問題ありません)。 私はSpring Data JPAでSpringブートを使用しており、ORMとして休止状態です。私はオブジェクトの完全な履歴のために履歴テーブルをIDで照会し、IDとバージョンで照会できるようにしたい。私はfindHistoryが休止状態呼び出すとき異なるPKを持つ2つの異なるテーブルを同じクラスにどのようにマップしますか?

@Entity 
@Table(name = "page") 
public Class Page { 
    @Id 
    @Column(name = "id") 
    private Integer id; 
    @Column(name = "version") 
    private Integer version; 
    //... 
} 

public interface PageRepository extends JpaRepository<Page, Integer> { 
    // Some current page specific methods... 

    @Query(value = "select * from page_history where id = :pageId order by version asc", nativeQuery = true) 
    List<Page> findHistory(@Param("pageId") Integer pageId); 

    //... 
} 

残念ながら、それは同じIDでResultSet内の複数のレコードがあるので、主キーとしてID列を認識します。 私はこのような何かを行うことができます(無駄に)期待していました第1レベルのセッションキャッシュを使用し、同じオブジェクトを複数回返します。

異なるマッピングを持つ2つの同一クラスを作成せずに理想的にする方法はありますか?

答えて

1

"ほとんど同一のテーブル"!= "同一のテーブル"。データベースを正規化する必要がある場合は、継承を使用して基本クラスを作成し、その相違を保持するエンティティで継承を拡張できます。しかし、私はデータベースの問題を補うためにJPAを操作しようとするのは良い考えだとは思わない。データベースを修正するか、2つの別個のエンティティを作成する方が良いでしょう。

+0

Javaオブジェクトは同じで、継承を使用するのはハックです。第1の表はレコードの1つのバージョン(現在の)のみを含み、第2の表はレコードの完全な履歴を含むので、制約は異なります。したがって、表1のPKはIDに過ぎず、表2のPKはIDとバージョン(両方の表にバージョンが存在する)です。 これはDB設計上の問題ではありませんが、JPAではサポートされていないようです。私はちょうど下のレベルに行く必要がありますし、SQLを記述し、結果セットから自分自身を読んでください。 – hookumsnivy

関連する問題