skillup

技術ブログ

Database Java

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

投稿日:2015年4月28日 更新日:

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文を書きます。

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

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

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

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

-Database, Java
-,

執筆者:


comment

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

関連記事

no image

メソッドのtransient

エンティティを作成するときに、データベースのカラムにない値をプロパティを持たせるためにはtransientという修飾子が必要です。 参考リンク フィールド以外のプロパティをエンティティに持たせる 通常 …

no image

MySQLのロックに関して+サブクエリ内のupdate

MySQLのロックに関して。 データベースではデータの整合性を保つために読み書きを一時的に制限する仕組みがあります。(データベースだけではないですが・・・) 大きく分けると共有ロック(書き込みは当然だ …

no image

第二、第三の正規化&ER図&Check制約

前回第一正規化を話したので、第二、第三に進んでいきます。 Contents1 第二正規化とは?2 第三正規化とは?3 正規化のメリット4 ER図5 本日のSQLネタ Check制約 第二正規化とは? …

no image

新アプリの本番環境デプロイについて

新しく作ったWEBアプリを本番配置しようとしたんですが、何度もやっているはずの処理がいざやろうとするといろいろと手間取ってしまい、1時間近くかかりました。 容量悪いなーと思いつつ、こういった行為はなる …

no image

データクレンジング

リレーショナルデータベースでデータを管理する前に、しなくてはいけないことはデータをデータベースに登録できる形に整形することです。 このことをデータクレンジングといいます。 これを行わずに何も考えずにデ …

アーカイブ