リファレンス
金英漢インフラ講座-Java ORM標準JPAプログラミング-基本編 Java ORM標準JPAプログラミング メンバーを検索するときにチームを一緒に検索しますか? チームとともに を出力
public void printUserAndTeam ( String memberId) {
Member member = em. find ( Member . class , memberId) ;
Team team = member. getTeam ( ) ;
System . out. println ( "회원 이름: " + member. getUsername ( ) ) ;
System . out. println ( "소속팀: " + team. getName ( ) ) ;
}
メンバー出力 のみ
public void printUser ( String memberId) {
Member member = em. find ( Member . class , memberId) ;
Team team = member. getTeam ( ) ;
System . out. println ( "회원 이름: " + member. getUsername ( ) ) ;
}
上記の場合,JPAはエージェントと遅延ロードによって解決できる.
遅延ロードを理解するには、まずエージェントを理解する必要があります.
エージェントインフラストラクチャ em.find() vs em.getReference() em.find():実際のエンティティ・オブジェクト をデータベースで問合せます.
em.getReference():クエリーがデータベースクエリーを遅らせる偽(エージェント)エンティティオブジェクト メソッドを呼び出すとDBクエリは実行されませんが、実際に使用する場合 クエリが呼び出されます. ただし、IDを問い合わせるときにクエリがないのはgetReference()を呼び出すときにパラメータが使用されるためである ID値を超えているので、どのIDなのかわかります. エージェントオブジェクトは、最初は空のシェルであり、内部は実際の参照を指す. 目標がある. は、ターゲット=nullでid値のみの偽オブジェクトを早期に返します. エージェントフィーチャー 実際のクラス継承作成(仮想マシンで処理) は実際のレベルの外観と同じです. を使用するユーザに対しては、真のオブジェクトかエージェントのオブジェクトかを区別することなく を使用することができる(理論的には)
エージェントオブジェクトは、実際のオブジェクトの参照 を含む.
エージェントオブジェクトを呼び出すと、エージェントオブジェクトは実際のオブジェクトを呼び出す方法 である.
プロキシオブジェクトの初期化 Member member = em. getReference ( Member . class , “id1”) ;
member. getName ( ) ;
開発者がgetName()を呼び出すと、MemberProxyはターゲットを確認します. targetはnullであるため、JPAはtargetを永続コンテキストに要求する.(本物のエンティティを取得します.) 永続コンテキストは、データベースクエリの後、実際のエンティティを生成します. targetと実際のエンティティとの接続 target.呼び出しgetName() エージェントの特徴 エージェントオブジェクトは、初回使用時に1回のみ を初期化する.
エージェントオブジェクトを初期化する場合、エージェントオブジェクトは実際のエンティティにはなりません.初期化後、エージェントオブジェクトを介して実際のエンティティ にアクセスできます.
エージェントオブジェクトは元のエンティティを継承しているので、タイプをチェックするときに特に注意してください(==インスタンスではなく比較に失敗しました) .
永続コンテキストで見つかったエンティティがすでに存在する場合、em.getReference()を呼び出しても実際のエンティティが返されます. メンバーはすでに永続コンテキストプライマリキャッシュに存在し、プロキシオブジェクトを作成する理由はありません. JPAでは、同じ永続性コンテキストにおいて、同じPKの==比較は常に同じである. 永続コンテキストヘルプのない準永続状態でエージェントを初期化中に問題が発生 (HyperNateはorg.hibernate.LazyInitializationException異常をトリガーします) (実務でよく見かける例外!) プロキシ認証 エージェントインスタンスを初期化するかどうかを確認します. PersistenceUnitUtil.isLoaded(Object entity) エージェントクラスを検証するには、次の手順に従います. entity.getClass().getName()出力(.javasist.or HibernateProxy...) エージェント強制初期化 org.hibernate.Hibernate.initialize(entity); 注意:JPA規格は強制初期化されていません
強制呼び出し:member.getName()
Reference
この問題について(プロキシサーバ), 我々は、より多くの情報をここで見つけました
https://velog.io/@roberts/프록시-b0z3kofh
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol