私は現在Eclipselinkを使用していますが、今日ではほとんどのJPA実装がかなり標準化されていることを知っています。 JPAエンティティをビューにマッピングするネイティブな方法はありますか?挿入/更新するつもりはありませんが、問題は本当に@Idアノテーションを処理する方法です。 JPAワールドのすべてのエンティティにはIDフィールドが必要ですが、私が作成したビューの多くはこれに準拠していません。 JPAでこれに対するネイティブサポートはありますか?それを機能させるためにハックを使用する必要がありますか?私はたくさん検索しましたが、これを行うことに関する情報はほとんど見つかりませんでした。
@Id
アノテーションは、直接サポートされているタイプのフィールドを使用して、エンティティのIDを指定する唯一の方法ではありません(@IdClass
複数の@Id
アノテーションまたは@EmbeddedId
と@Embedded
)、JPA仕様では、エンティティごとに主キーが必要です。
つまり、データベースビューでJPAを使用するためにエンティティは必要ありません。ビューへのマッピングはSQLの観点からのテーブルへのマッピングと同じなので、ネイティブクエリ(createNativeQuery
on EntityManager
)を使用して、代わりにスカラー値を取得できます。
私はこれを自分で調べていて、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か月後にはもう気にしないという素晴らしいチャンスがあります。 :-)なんと、その「ネクロマンサー」バッジは、それ自体を獲得するだけではありません...
私の見解では「固有の」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;