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