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

BeanUtilsについて

以前このエントリーでも紹介しましたが、BeanUtils、思った以上に使い方が幅広いです。 Contents1 クラスからクラスに2 マップからクラスに3 クラスからマップ4 特定の値の取り出し5 リ …

no image

CASE式のすすめ

SQL実践入門を7割がたぐらい終えたところで同著者の方の「達人に学ぶSQL徹底指南書」を学習しようと思っています。 この方の著書は気づいたら結構読んでましたね。 Contents1 CASE式での注意 …

no image

cake sql系+リレーション+ヘルパー

先月末に引き続いてcakeネタをもりっといきます。 といっても自分用の小ネタリンク集です。 Contents1 sql系の小ネタ1.1 findとread1.2 find(‘count&# …

no image

GlassFishでDB接続

JavaEEではアプリケーションサーバーとしてGlassFishを使いますが、先日、GlassFishを通さないとJavaEEでDBが動かせないということを知りました。そのためJavaEEではデータベ …

no image

ガベージコレクタに関して

本日はガベージコレクタに関して。 Contents1 ガベージコレクタとは?1.1 1 nullを代入1.2 2 参照変数を他のオブジェクトに割り当てる1.3 finalize()メソッドの定義 ガベ …

アーカイブ