0

私は現在、子を親エンティティに保存するための作業コードを持っています。しかし、休止状態を通過するselectステートメントに過負荷がかかっているので、私は正しいことをしているのだろうかと思っています。私はキャッシングを使用しているので、ATMで遅延の問題は発生しませんが、もっと効率的になることはできないのではないかと思います。この小さな抽出物を例として取り上げます

MbaLog.debugLog(logger, "Saving CodeType");
Site site = codeType.getSite();
if (site != null && site.isProxy())
    codeType.setSite(siteRepository.loadSiteById(site.getId()));
Long recordId = codeRepository.saveCodeType(codeType);

保存しているエンティティCodeTypeに、子サイトがあります。この子は、IDだけが入力されたプロキシオブジェクトとしてメソッドに渡されます。次に、完全にロードされたSiteオブジェクトをデータベースからフェッチし、コードタイプに設定します。次に、hibernateのsessionfactoryを使用してcodeTypeをデータベースに保存します(コードはここには表示されませんが、codeRepositoryの背後にあります)。

これは機能しますが、独自の子を持つ完全なサイトをロードしているため、挿入の前に少なくとも5つのクエリが渡されます。私はサイトに多くのものを怠惰に置くことができましたが、より深い層でコードが複雑になる可能性があるため、当面はそうしません。私は仕事で休止状態とJPAを学ぶ必要があり、過去に専門家から多くのトレーニングを受けたことはありませんでした。だから私は疑問に思っています、コードタイプでサイトを保存するためのショートカットはありますか?完全にロードする必要がありますか、それともIDで十分ですか?またはIDとバージョンのみ(楽観的ロックのためにすべてのエンティティで@versionアノテーションを使用しています)

前もって感謝します

4

2 に答える 2

1

(または)を使用してSIteエンティティへの参照を取得する代わりに、Session.get()(または)を使用してこの参照を取得します。EntityManager.find()Session.load()EntityManager.getReference()

これらのメソッドは、サイトのデータを取得するためのクエリを実行するのではなく、エンティティで遅延ロードされたプロキシを返します。

于 2012-10-27T15:04:22.087 に答える
1

永続化したいのがSiteとCodeTypeの関係だけである場合は、レイジーインスタンスでおそらく十分です。したがって、EntityManager.find()の代わりにEntityManager.getReference ()(遅延読み込み)を使用できます。

于 2012-10-27T15:07:04.480 に答える