質問

Hibernate を利用したトランザクション サービス メソッドを通じてデータを渡すときに、DTO の使用を回避する本当に実用的な方法はあるのでしょうか?言い換えれば、遅延初期化の問題を回避するためのハック的でない唯一の解決策は DTO なのでしょうか?

DTO に代わる 2 つの人気のある選択肢と、私がそれらをあまり好きではない理由は次のとおりだと思います。

  1. ビューパターンでセッションを開きます。サービスメソッドを真のトランザクションに保ちたいので、これは好きではありません(つまり、Hibernate セッションはコミットされ、メソッドが終了すると閉じられます)。これは主に、たとえば後でサービスを Web サービスとして公開する必要がある場合に、トランザクションについて心配したくないためです。

  2. DTO の代わりにサービス メソッドを介してドメイン/ビジネス オブジェクトを渡し、必要な属性/プロパティを積極的にフェッチします。これはいくらか良いです。ただし、複雑なエンティティ関係を持つ自明ではないドメイン オブジェクト階層では、積極的なフェッチはどこかで停止する必要があります。そして、それが実現した場合、エンティティをあちこちの参照 ID に置き換える完全なハッカトンにすぐにならないわけがわかりません。

何かが欠けているのでしょうか、それとも保守性の観点から見て実際には DTO が唯一の確実なアプローチなのでしょうか?

役に立ちましたか?

解決

本当にエンティティを使用する唯一の方法は、端へOpenSessionInViewより少しより洗練されたものを使用することです。私の経験では、アプリケーションレベルで手動で休止状態のセッションを管理する必要があるとしています。 OpenSessionInViewはあなたに1つのリクエストに同じセッションを提供します。その後、あなたは常に現在のセッションに再接続する必要があります。 Seamとの会話を見てみましょうか、独自のHibernateのSession管理を実装。我々は現在、手動で

(セッションは、AJAXと安全ではなく、良いミックスをスレッドしていない)と、ウィザードが開始および終了に基づいて、当社のセッションを管理し、時間だけで右のスレッドにセッションを添付する春AOPを使います 一方、

Webサービスは最も確かにDTOのいくつかのフォームを必要としています。私はそれを回避する方法が表示されません。エンティティは、POJOのように見えるかもしれませんが、実際には、それらをシリアル化することは難しいからほぼ不可能の範囲とすることができるされていません。ただ、サービスメソッドの目標に適合し、それを使って行うことのDTOを作成します。

あなただけのウェブサイトを作っている場合は、

個人的に私は、DTOパターンがひどいとは思わない、それはエンティティと端から端まで行くために可能だと言ってもあなたにいくつかのパフォーマンスを購入することができますが、より柔軟なアーキテクチャをたい場合、のDTOに固執します。

他のヒント

リポジトリ、サービス、およびコントローラは、アプリケーションのコアを扱う場所でなければなりません(必要であればHibernateのSessionは確かに、リポジトリ層の全体として使用することができます)。

ビューは、アプリケーションのコア、ドメインモデルを扱うことになっていません。彼らは、ライブオブジェクトを扱うが、ライブオブジェクトの非ライブ、仕立て表現とすべきではありません。ビューは、彼らはそれを必要とする特定の形式で、彼らは必要なだけのデータを渡すことになっています。あなたはあなたの意見のためのDTOを構築する必要があります。このパターンはまた、ドメインモデルと対比して、ビューモデルとして知られています。

あなたの人生を容易にするために、ライブラリやフレームワークができ、あなたのビューモデルオブジェクトへのドメインモデルオブジェクトから自動マップ、およびバックがあるかもしれません。 .NETでは、現在開発中のAutoMapperと呼ばれるオープンソースのフレームワークがあります。私は、Javaのためにそこにあるかわからないんだけど。

あなたは、セッションを閉じるには、あなたの要件を緩和した場合は、

、あなたはまだビューで開いているセッションを使用して、ちょうどあなたのサービス取引のすべてをコミットすることができます。セッションがまだフェッチ怠惰に利用できるようになりますが、すべてのトランザクションが完了します。あなたは、Webサービスに切り替えるつもりなら、あなたはとにかく熱心な負荷にあなたのエンティティのすべてが必要になります。 DTOはちょうど熱心な負荷を意識的かつ偶発怠惰を防ぐために、あなたを強制します。

あなたが注意しているのであれば、一番下の行は、あなたが両方の環境でのDTOをスキップすることができますが、彼らが実際に要件となったとき、私はおそらくビューで開いているセッションに固執し、Webサービスを心配でしょう。

私はのDTOのアイデアを愛し、私はいつも、彼らは非常によく受け入れられたか、適切にすべての方法ダウンのデータベースへのアプローチを実装するため、他の開発者に好か通常、多くの労力を必要としていなかったことを感じました。私はあなたがすることができたこのブレイズ - 永続エンティティ・ビューを作成した理由はここにあります効率的な方法でJPAエンティティモデルにマッピングインターフェースとしてモデルのDTO。あなたがクエリにエンティティのビューを適用することができ、クエリはそれだけですべての状態ではなく、実際に必要な状態を取得し、Javaでそれをマッピングすることのように適応されます。

所望の構造が熱心にロードされているので、

エンティティ・ビューを使用することによって、あなたは、ビューアンチパターンでオープンセッションを必要としません。関与なしエンティティオブジェクトが存在しないので、また何の遅延ロードの問題は存在しません。

エンティティモデルは、多くの場合、開発の初期段階でDTOモデルに非常に似ているので、私は多くの場合、開発者はちょうど彼らが面倒を回避しようとして別のDTOモデルを作成スキップご覧ください。すぐに、監査などの横断的関心事として、エンティティモデル内のエンティティモデルやデータ量の統計や非正規化の土地は、あなたが実際のエンティティのユースケースのために必要なものをより多くの、より大きな成長し、開発者が問題に実行。

ブログなどの確認のためにあなた意志私はいくつかの時間前に書いた事項についてを投稿します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top