skillup

技術ブログ

Database Java

JPAでのリレーション(アノテーション使用)

投稿日:

JPAでリレーションを管理するとき、最初はアノテーションでやろうとしたんですが、結局やり方がわからずコンストラクタ式をかいて対処してました。

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

外部キー制約があるやり方はしっていたんですが、ないときの対処法はわからずじまいでした。

が、いろいろ試してみたところアノテーションでさっくりいけることが判明。

メモしておきます。

多対多は試していないんですが、1対多となる2つのパターンは確認できました。

1対多

1つ目は注文テーブル(sample_order)と注文詳細テーブル(orderline)のようなパターン

この場合、

注文詳細テーブル側が注文テーブルに属しており、どの注文テーブルにひもづけられるのか?というidをもっていることが一般的です。(今回はorder_idとします。)

sample_order がidだけをもち、

orderlineはid,item,price,order_idだけのテーブルだとします。

ブログなんかでユーザー→そのユーザーのコメントなんかがこのパターンですね。

サンプルが一番わかりやすいと思うので下記に紹介します。

SampleOrder.java

OrderLine.java(通常のエンティティを書けばよく、特別なことは書く必要なし)

これだけでSampleOrderのエンティティを取得すると、同時にOrderlineも取得できます。

多対1

もう一つは注文詳細テーブル-商品テーブルパターンです。

注文詳細側が商品テーブルのidを別名(product_id)でもっているパターンです。

注文詳細側をid,order_id,prooduct_id

商品テーブル側をid,name,priceで構成されているとします。

その場合下記のようになります。

OrderLine.java

Product.java(基本的にリレーションに関する情報はかかなくてOKです。)

組み合わせることでSampleOrderを取得すればProductまで一気に取得できます。

長年の悩みがやっと解けました・・・が、半年前に気づけてればよかったです(汗)。

ただ、超簡単なSELECTのリレーションしかやってないのでinsertのときとかはまたいろいろと調べることになりそうです。

-Database, Java
-,

執筆者:


comment

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

関連記事

no image

Fileのアップロード

業務でCSVのアップロードを行っていますが、ファイルになりますと当然文字列ではなく、バイナリ形式のデータが必要になります。 アップロード自体の処理を書いていなかったので、その扱い方についてちょっと書い …

no image

オプティマイザと実行計画

データベースがSQLを受け取って処理を実行する前には下記のような段階があります。 Contents1 パーサー2 オプティマイザ3 カタログマネージャー4 テーブルからデータの取得5 参考リンク パー …

no image

JPAまとめ

JPAわけわかんねーと思い、触りはじめてから3か月ぐらいたちます。 いまだに細かい部分はよくわかっていないことは多いのですが、全体像というか何となくどういうものかはわかり始めてきたいのでまとめたいと思 …

no image

SQLクエリ比較

クエリの比較 SQLにおいては全く同じ結果を返すのであってもその検索結果が異なるということはよくあります。 例えば下記のようなテーブルがあった場合 co_cd | district —&# …

no image

persistence.xmlのプロパティについて

JavaEEではデータベースとの設定情報はpersistence.xmlに記述します。 (ユーザー名、パスワード、ポート、driver名、データベース名などの情報はglassfish-resource …