2011-12-28 17 views
0

JPAでビューからエンティティを読み取り、テーブルを更新することは可能ですか?JPA:ビュー更新テーブルから読み取る

例を与える:

Sample Schema

我々はSuppliersInvoice_VWから読み込むエンティティを持っています。 このビューおよび関連するエンティティには、InvoiceNo、SupplierCode、SupplierNameおよび値が含まれます。

ユーザーはこれらの線に沿って何かを見ている:

請求書番号:1234
サプライヤー:ジョーズハードウェア
値:彼は値が509であることを実感ますので、彼は更新50

したがって

請求書番号:1234
サプライヤー:ジョーズハードウェア
値:509

これにより、SuppliersInvoiceエンティティの更新がトリガーされます。

私は@Table("SuppliersInvoice_vw")をマッピングしました。つまり、SuppliersInvoice_vwからデータを読み込むことを意味しますが、これはそのビューを通じて更新されることを意味します。

SuppliersInvoice)テーブルをJPAは(SuppliersInvoice_vw)ビューから読み取る作成し、更新する方法はありますか?

代わりに、ビューを更新するだけですが、私はいつもこれもやってはいけないとアドバイスしました。このアドバイスには成果の基盤がありますか、「ビューを更新するときに何が問題になるのかを知る」という行に沿ったものですか?

+0

ユーザーがビュー(ウェブページなど)で何かを変更すると、JPAが何らかの形で変更を検出してデータベースを更新することを意味しますか? –

+0

@ Mr.J4mesいいえ私はユーザーインターフェイスに興味がありません。これは、JPAがビューから読み込んでテーブルを更新できるかどうかを尋ねています。 –

+1

いいえ。その状況のJPAには何もありません。 – DataNucleus

答えて

1

JPAで透過的に欲しいとは思っていません。

JPA仕様では、単一の@Table@Entityに限定しています。これを処理する最も簡単な(そしてほとんどの移植可能な)方法は、2つの別個の@Entityクラス(ビュー用とテーブル用)を同様のプロパティで使用し、読んでいるかどうかのコンテキストに基づいてどちらを使うかを選択することですまたは書く。

プロパティが整列している場合は、コモンBeanUtils.copyPropertiesを使用して、書き込み可能オブジェクトをビュー1から初期化できます。

基本的に、データベースビューにマッピングされる読み取り専用エンティティは、DTOと似ていますが、そのように扱うことになります。

1

これまでビュー/テーブルとエンティティで同じ問題が発生しました。どのバックエンドデータベースを使用しているのか分かりませんが、私の場合はPostgreSQL 9.xを実行していました。この問題に対処するために、自分のビューにINSERTまたはUPDATEできるトリガーをデータベースに作成し、トリガーを介してビューの背後にあるテーブルを適切に更新しました。そうすれば、SuppliersInvoiceエンティティオブジェクトを更新し、JPAを使用して通常どおり変更を永続化できますが、バックエンドデータベースは提供している更新に基づいて実際のテーブルを適切に更新します。

ここには、PostgreSQL 9.1のINSERT/UPDATE/DELETE rulesドキュメントへのリンクがありますので、自分で見ることができます。

関連する問題