skillup

技術ブログ

Database Java

JPAでのリレーションに関して

投稿日:

JPAではテーブルをクラスで定義します。もちろん例外とかはいろいろあるのですが、1テーブル1クラスというつくりで、これをエンティティと呼びます。

もともとクラスを作ってからDBを作成したり、JTAの規約どおりにテーブルが設計されていればリレーションなどもSQLを書くことなく楽にかけます。
ところが、規約を無視していたりするとなかなかこれが難儀です。

JPAでのリレーションの取得方法

JPAでリレーションを定義する方法は大きく分けて、

  1. リレーションされたテーブルのプロパティを格納しておくエンティティクラスを再作成する方法
  2. アノテーションでリレーションを管理する方法

の2通りがあります。

WEBでいろいろ検索しましたが、2の情報のほうがよくでてきますね。

ただアノテーションで管理する場合、WHERE句が複雑なときの対処法などがいまいちよくわかりません。SQLを書かなくてよいメリットはあるのですが。

ここでは1の方法であるリレーションされたテーブルのエンティティを再作成する方法を説明したいと思います。

SnapCrab_NoName_2015-4-28_1-1-35_No-00

ここでProductとSupplierをリレーションでつなげたいとき、

1 Product,Supplier両方のプロパティを保持するクラスをつくる。例えばSettedProductとします。

2 SettedProductに保持させたいプロパティと定義する、リレーション情報などは一切書かない。
この例で言うとproductID,supplierId,supplierName,productNameをprivateで普通に定義し、ゲッター、セッターと後述するインスタンスを記述しておきます。

3 エンティティマネージャーにて下記のようなJPQLのSQL文を書きます。

List<SettedProduct> products ;

products=em.createQuery(“SELECT new com.sample.SettedProuct(p.productID,p.supplierId,s.supplierName,p.productName) FROM Product p LEFT JOIN  Supplier s ON p.supplierID=s.Id “,SettedProduct.class).getResutList();

これでproductsをみてリレーションが取れていればOKです。

SQL文の中でnew パッケージ名 をコンストラクタ式といいます。SettedProductのなかにはこのコンストラクタを当然用意しておかなくてはいけません。

ようはJOINしたプロパティを収容できるクラスを定義し、そこに対してセットします。

プロパティが多いと大変そうですが、とりあえずこれでリレーションがとえます。

 

-Database, Java
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

データベース設計のアンチパターン 重すぎるOLTP+Date型不統一+データ量想定が甘い

Contents1 重すぎるOLTP1.1 デメリット1.2 対策2 DATE型の型の不統一2.1 デメリット2.2 対策3 データ量の想定が甘い3.1 デメリット3.2 対策 重すぎるOLTP ※O …

no image

複数GROUP BYでの注意

GROUP BYしたときに件数が増えるという現象があったので一応メモ。というか当たり前のことですが・・・ たとえば以下のようなテーブルがあったとします。 student id student_name …

no image

Optionalについて その2

JavaEEブログなはずなのに11月はcakeのことばかり書いていて、Javaのことすら書いていないですね(汗) 今日はOptionalについて書きます。 いまいち使い方がわからなかったんですが、自分 …

no image

CDIの循環依存エラー&JSFでの条件分岐について

本日は小ネタなので2つのネタをまとめます。 Contents1 CDI循環依存エラー2 JSFでの条件分岐 CDI循環依存エラー 半年近くやってますが、いまだにJavaEEでエラーがでてくると焦ります …

no image

アンチパターン データ分身の術+DBの不要な連携+バージョンアップ未テスト

今回のアンチパターンは主にデータ設計に関する部分。 Contents1 同一データの使用1.1 デメリット1.2 対策2 DBの不要な連携2.1 デメリット2.2 対策3 サーバーの移行やバージョンア …