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

NOT EXISTSの利用2

今回もNOT EXISTSの利用です。 前回の問題にプラスアルファし、列が一緒でないと連続でも意味ない仕様にします。 例えば下記のようなテーブルがあるとします。 seat | row_id | sta …

no image

SQLインジェクション

セキュリティ関係の知識がぬるいのでちょっとお勉強。 知っていることもあるが復習もかねて勉強を。 Contents1 SQLインジェクションとは?2 被害3 対策4 参考サイト・書籍5 ソース SQLイ …

no image

JPQLでの算術関数

複雑なJPQLを書いていると、通常のレコードの取り出しだけではなく、合計(SUM)や算出(COUNT)などのいわゆる算術関数を使うことが一般的です。 JPQLでもこれらを通常通り扱うことができます。 …

no image

Javaでの文字コード判定、変換

Javaにて文字コード判定の処理を書きます。 Contents1 通常の文字コードの判定、変換2 ファイルの文字コード判定、変換2.1 juniversalchardet2.1.1 ダウンロード2.1 …

no image

集合としてのSQL

今まで何度かSQLが集合ということを扱ってきました。 今回はそれがよくわかる例を。 実務ではあまりないと思うのですが、集合をイメージしやすい例題として、2つのテーブルが全く同じケースを考えます。 下記 …

アーカイブ