web-dev-qa-db-ja.com

JPAはSQLビューへのマッピングをサポートしていますか?

私は現在Eclipselinkを使用していますが、今日ではほとんどのJPA実装がかなり標準化されていることを知っています。 JPAエンティティをビューにマッピングするネイティブな方法はありますか?挿入/更新するつもりはありませんが、問題は本当に@Idアノテーションを処理する方法です。 JPAワールドのすべてのエンティティにはIDフィールドが必要ですが、私が作成したビューの多くはこれに準拠していません。 JPAでこれに対するネイティブサポートはありますか?それを機能させるためにハックを使用する必要がありますか?私はたくさん検索しましたが、これを行うことに関する情報はほとんど見つかりませんでした。

33
GBa

@Idアノテーションは、直接サポートされているタイプのフィールドを使用して、エンティティのIDを指定する唯一の方法ではありません(@IdClass複数の@Idアノテーションまたは@EmbeddedId@Embedded)、JPA仕様では、エンティティごとに主キーが必要です。

つまり、データベースビューでJPAを使用するためにエンティティは必要ありません。ビューへのマッピングはSQLの観点からのテーブルへのマッピングと同じなので、ネイティブクエリ(createNativeQuery on EntityManager)を使用して、代わりにスカラー値を取得できます。

9
Nils Wloka

私はこれを自分で調べていて、100%確実な作品ではないけれども有望に見えるハックを見つけました。

私の場合、ビューにFK列があり、PKとして効果的に機能できます。その外部オブジェクトの特定のインスタンスは、ビュー内で1回しか出現できません。その1つのフィールドから2つのオブジェクトを定義しました。1つはIDに指定され、フィールドの未加工の値を表し、もう1つは読み取り専用に指定され、参照されるオブジェクトを表します。


@Id
@Column(name = "foreignid", unique = true, nullable = false)
public Long getForeignId() {
...

@OneToOne
@JoinColumn(name = "foreignid", insertable=false, updatable=false)
public ForeignObject getForeignObject() {
...

私が言ったように、これについては100%確実ではありません(そして、それが機能しないことが判明した場合は、この回答を削除します)が、コードが特定のクラッシュポイントを通過しました。

ただし、特定の状況に当てはまる場合は、そして、11か月後にはもう気にしないという素晴らしいチャンスがあります。 :-)なんと、その「ネクロマンサー」バッジは、それ自体を獲得するだけではありません...

0
BlairHippo

私の見解では「固有の」IDがあるため、それをエンティティーIDとしてマップしました。それは非常にうまく機能します:

@Entity
@Table(name="table")
@NamedQuery(name="Table.findAll", query="SELECT n FROM Table n")
public class Table implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="column_a")
    private int columnA;
0