JPA/hibernate

Spring-data-JPA/hibernateを案件で使ってみて得た知識

投稿日:2017年12月21日 更新日:

ORMが解決するのは、オブジェクトの相関関係とデータベースの相関関係がミスマッチすること。

基本的にはORMを使うなら、既存のDB構造(スキーマ)を、ORMには合わせる、つまりオブジェクトの相関関係に合わせること。

それが、ORMを効果的に使用する最初のポイントである。既存のスキーマをオブジェクトの実際モデルに合わせることである。

@OneToMany,@ManyToOneなど、エンティティ同士の関連はORMの肝となる。

cascade

mappedby

@JoinColumn 中間テーブル(結合テーブル)が生成される。

Lazy Fetch/Eager Fetch はクエリのタイミングを指示するものである。N+1問題の解決ではない。

EagerFetchは問答無用でN+1回のSELECTになる。LazyFetchはコレクションをループしない限り、N回のSELECTは発行されない。

デフォルトでは、取得先が1インスタンスに決まる関連はEagerだが、取得先が多となる関連はLazyである。

Eager設定は基本的にパフォーマンスのボトルネックとなるので、避けることを推奨。

N+1問題

@Fetch で対応する。
hibernateについてよくまとまったPDF

http://www.devfesta.jp/2007/pdf/R2.pdf

JPAについてよくまとまったhtml

http://terasolunaorg.github.io/guideline/5.3.1.RELEASE/ja/ArchitectureInDetail/DataAccessDetail/DataAccessJpa.html

Spring-data-JPAでは、Repositoryインターフェースを使用してエンティティ管理を行う。RepositoryとはEntityManagerのラッパーである。

JPAに慣れると、リレーショナルで考えるのが嫌になります。リレーショナルは実際モデルとは少し違うからです。

その点が、JPAをうまく使うコツでもあります。JPAを使うときは、リレーショナル思考を忘れて、実際モデルに則したオブジェクト指向(思考)で考えるとすっきりします。

その時RDBは単なるデータストアになります。

人の思考はオブジェクト指向に近い

https://cybozu.co.jp/products/cyde/index2.html

ORMのメリット

http://www.atmarkit.co.jp/ait/spv/0404/13/news075.html

-JPA/hibernate

執筆者:


comment

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

関連記事

no image

hibernate入門を読んだ。JPAのN+1問題の解決方法

この本をkindleで読んだ。お勧めしておきます。著者はケンブリッジ大学の理系出身。 常にN+1SELECTが悪いわけではなく、むしろいい意味で処理が分散して処理が高速化したり、より安定することもあり …

no image

Spring-boot-JPAの実行SQLをログ出力する

せっかくJPA導入したのだから、ネイティブSQLは使用しない方がいいです。 しかし、データストアがRDBの場合は、パフォーマンスチューニングや開発時に欲しいデータが取れない場合は、SQLを見直したい時 …

no image

Spring-data-JPAかmy-batisか

JPAとJDBCは異なるもの。 両方使うことも出きるし、片方だけ使うこともできる。 Springboot使い始めると、JPA使うか否かの選択になります。 言い換えると、SQL使うか否かですね。 私の意 …

no image

N+1問題でJPAを諦めるのはもったいない

JPAを実案件で使ってみて。時間をかけて勉強することが必ず必要となる。 自分はいきなりJPAで組むことになった。最初はJPQL使わずにJPAPepositoryの標準メソッドだけでごまかしごまかしやっ …