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

文字列のENUM化

文字列をENUM化したいときの処理について リンク集です。 ENUMが文字だけのとき(key=>valueタイプでない時)、key=>valueタイプの時両方OKのようです。 enum 定 …

no image

自己結合に関して

以前もこのエントリーで学習しましたが、SQLの結合では自己結合という考え方があります。 下記のようなテーブルProductsがあるとします。 name | price ——&# …

no image

instanceofとgetClassについて

Javaでの型の判定などに使われるinstance ofとgetClassについてメモしたいと思います。 Contents1 instance of2 getClass instance of A i …

no image

arquillianでのリソースファイル読み込み

以前、このエントリーでarquillianからライブラリが利用できず、追加のライブラリを導入した、ということを書きました。 実はリソースファイルもそのままですとarquillianからは使用できません …

no image

SQL結合 サブクエリに関して

今回はサブクエリに関してです。 もちろんSQL実践入門を読み進めています。 SQL上ではテーブル、ビュー、サブクエリというのは機能的にはそれほど変わらず主にパフォーマンスの点で違いがでてきます。 以下 …