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

checkboxでの値の管理

formにてcheckboxの値を一つのカラムにいれて管理する機会があったのですが、これ入力更新出会っても検索であっても処理がなかなか厄介です。特に検索の時ですね・・・ 要するに値の候補が1,2,3, …

no image

列挙型Enumについて

列挙型のクラスであるEnumについてのメモです。 ちなみにEnumの読み方はイナムまたはイニュームだそうです。 Contents1 列挙型とは?1.1 基本の使い方1.2 key=value的な使い方 …

no image

SQL基礎 ウィンドウ関数

SQLの基礎(主にSELECT)を whereはレコードに対しての集計、havingはレコードの集合に対しての集計 ビューは一時的なselect文なのでサブクエリとほぼ等価 条件分岐で出力項目を変えた …

no image

Javaでのスクレイピング

スクレイピングというと一般的にはRubyが一番有名なようですが、もちろんスクレイピング自体はどの言語でも行うことができます。 Contents1 スクレイピングの手法1.1 正規表現1.2 HTMLパ …

no image

CentOS上にglassfish構築+arquillianテスト

JavaEEの開発でアプリケーションサーバーとしてglassfishを使っています。 今回、CentOS(ver6.6)に立てる機会があったので、そのネタを共有したいと思います。 Contents1 …