私は現在Eclipselinkを使用していますが、ほとんどのJPA実装がかなり標準化されていることを知っています。JPAエンティティをビューにマップするネイティブな方法はありますか? 私は挿入/更新を検討していませんが、問題は実際に @Id アノテーションを処理する方法です。JPA の世界のすべてのエンティティには ID フィールドが必要ですが、私が作成したビューの多くはこれに準拠していません。JPAでこれに対するネイティブサポートはありますか、それとも機能させるためにハックを使用する必要がありますか? 私はたくさん検索しましたが、これを行うことに関する情報はほとんど見つかりませんでした。
4 に答える
@Id
直接サポートされているタイプのフィールドでアノテーションを使用することは、エンティティーの ID を指定する唯一の方法ではありませんが ( @IdClass
with 複数の@Id
アノテーションまたは@EmbeddedId
with を参照@Embedded
)、JPA 仕様ではエンティティーごとに主キーが必要です。
つまり、データベース ビューで JPA を使用するためにエンティティは必要ありません。ビューへのマッピングは、SQL の観点から見たテーブルへのマッピングと変わらないため、代わりにネイティブ クエリ ( createNativeQuery
on EntityManager
) を使用してスカラー値を取得できます。
私はこれを自分で調べてきました.100%確実に機能するわけではありませんが、有望に見えるハックを見つけました.
私の場合、PK として効果的に機能できるビューに FK 列があります。その外部オブジェクトの特定のインスタンスは、ビュー内で 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か月後には気にしなくなる可能性が非常に高くなります. :-) なんてこった、その「ネクロマンサー」バッジはそれだけでは稼げない....