[解決済み] Spring ControllerでJPAとHibernateを使用してFetchType.LAZYのアソシエーションを取得する方法
質問
Personクラスがあります。
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
@ManyToMany(fetch = FetchType.LAZY)
private List<Role> roles;
// etc
}
多対多のリレーションが遅延している状態。
私のコントローラでは
@Controller
@RequestMapping("/person")
public class PersonController {
@Autowired
PersonRepository personRepository;
@RequestMapping("/get")
public @ResponseBody Person getPerson() {
Person person = personRepository.findOne(1L);
return person;
}
}
そして、PersonRepositoryは、次のコードに従って書かれたものだけです。 このガイド
public interface PersonRepository extends JpaRepository<Person, Long> {
}
しかし、このコントローラでは 私は実際にlazy-dataを必要としています。どのようにしたら、その読み込みをトリガーできるのでしょうか?
アクセスしようとすると、次のように失敗します。
ロールのコレクションを遅延初期化することに失敗しました。 no.dusken.momus.model.Person.roles, プロキシを初期化できませんでした - no セッション
など、試行錯誤の結果、例外が発生しました。
私の xml-description。 必要であれば
ありがとうございます。
解決方法は?
遅延コレクションを初期化するために、明示的に呼び出す必要があります (一般的な方法としては、遅延コレクションを呼び出すために
.size()
を使用します)。Hibernateでは、このための専用のメソッドがあります(
Hibernate.initialize()
) が、JPAにはそれに相当するものがありません。もちろん、セッションがまだ利用可能なときに呼び出されるようにしなければなりませんので、コントローラメソッドに
@Transactional
. 代替案としては、コントローラとリポジトリの間に中間サービス層を作成し、遅延コレクションを初期化するメソッドを公開することができます。
更新します。
上記の解決策は簡単ですが、データベースへの問い合わせが2つになることに注意してください (1つはユーザーに対するもの、もう1つはロールに対するものです)。より良いパフォーマンスを得たい場合は、以下のメソッドをSpring Data JPAリポジトリのインターフェイスに追加してください。
public interface PersonRepository extends JpaRepository<Person, Long> {
@Query("SELECT p FROM Person p JOIN FETCH p.roles WHERE p.id = (:id)")
public Person findByIdAndFetchRolesEagerly(@Param("id") Long id);
}
このメソッドでは、JPQLの フェッチジョイン 節を使用して、データベースへの一回のラウンドトリップでロールの関連付けを積極的にロードすることで、上記のソリューションで2つの異なるクエリによって発生するパフォーマンスの損失を軽減することができます。
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
jd-gui Java Exceptionが発生しました。
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
サーブレットクラスのインスタンス化エラーの解決法
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
[解決済み] Jackson JSONとHibernate JPAによる無限再帰の問題
-
[解決済み] springの@Controllerアノテーションと@RestControllerアノテーションの違いについて
-
[解決済み】HibernateとSpring Data JPAの違いは何ですか?
-
[解決済み】混乱中。JPAとHibernateでの@NotNullと@Column(nullable = false)の比較。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.util.NoSuchElementException 原因解析と解決方法
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
自動配線された依存性のインジェクションに失敗しました。
-
org.glassfish.jersey.servlet.ServletContainer
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。