4

Hibernateを使用したトランザクションサービスメソッドを介してデータを渡すときにDTOを使用しないようにする本当の方法はありますか?言い換えれば、DTOは怠惰な初期化の問題を避けるための唯一の非ハックな解決策ですか?データ転送オブジェクトとトランザクションサービスメソッド

  1. オープンセッションビューのパターンで:

    は私がのDTOには、2つの人気のある選択肢と私は本当に彼らがいる好きではない理由だと思います。これは、サービスメソッドを本当にトランザクション的に保ちたい(つまり、メソッドが終了するとHibernateセッションがコミットされ閉じられる)ので、私は気に入らない。これは主に、後でWebサービスとしてサービスを公開する必要がある場合、トランザクションについて心配する必要がないためです。

  2. DTOの代わりにサービスメソッドを使用してドメイン/ビジネスオブジェクトを渡し、必要な属性/プロパティを取得することができます。これはやや良いです。しかし、複雑なエンティティリレーションを持つ自明でないドメインオブジェクト階層では、熱心な取り込みはどこかで停止する必要があります。そして、そうなったら、どのようにしてこれが完全に素早く完全なハックトンに変わらないのかわかりません。

実際には保守性の観点から唯一の堅実なアプローチであることが分かっていますか、DTOですか?

答えて

1

エンティティのエンドツーエンドを実際に使用する唯一の方法は、OpenSessionInViewよりも少し洗練されたものを使用することです。私の経験では、アプリケーションレベルで手動で休止状態のセッションを管理する必要があります。 OpenSessionInViewは1つのリクエストに対して同じセッションを提供します。その後、現在のセッションに常に再接続する必要があります。 Seamと会話を見たり、独自のHibernateセッション管理を実装したりしてください。私たちは現在、ウィザードの開始時と終了時に基づいてセッションを手動で管理し、Spring AOPを使用してセッションを正しいスレッドにただちに接続します(セッションはスレッドセーフではなく、AJAXとうまくミックスされません)

WebServices手は最も確かにDTOの何らかの形を必要とするでしょう。私はその周りに道を見ない。エンティティはPOJOのように見えるかもしれませんが、実際にはそうではありませんが、直列化することは難しいから不可能にまで及ぶ可能性があります。サービスメソッドの目標に合ったDTOを作成し、それを使って完了させるだけです。

個人的に私はDTOパターンがひどいとは思わない、あなたがウェブサイトを作ってエンティティといっしょに終わりに行くことができれば、あなたにはいくつかのパフォーマンスを買うかもしれないが、アーキテクチャ、DTOに固執する。

0

セッションを閉じる要件を緩和しても、開いたセッションを表示して、サービストランザクションのすべてをコミットすることができます。セッションは遅延フェッチでも使用できますが、すべてのトランザクションは完了します。しかし、Webサービスに切り替える場合は、とにかくすべてのエンティティを熱心に読み込む必要があります。 DTOはあなたに意識的に熱心な負荷をかけ、偶発的な怠惰を防ぐだけです。

慎重に考えれば、両方の環境でDTOをスキップすることができますが、実際には開いているセッションを見据えて、実際に要件が満たされたらWebサービスについて心配しています。

+0

セッションを開いたままにしておくと分かりやすいようです。 Webサービスの難しい部分は、エンティティオブジェクトツリーが深い場合、一部のブランチを切り捨てるか(後で問い合わせる)、または参照するIDに置き換える必要があるということです。一度これを行うと、基本的にDTOがサービスの外に形成されています。 –

1

リポジトリ、サービス、およびコントローラは、アプリケーションコアを扱う場所でなければなりません(Hibernateセッションは、必要に応じて確実にリポジトリレイヤ全体として使用できます)。

あなたのアプリケーションのコアであるドメインモデルは、ビューには対応していません。ライブオブジェクトを扱うべきではなく、ライブオブジェクトの非ライブで調整された表現を使用するべきです。ビューは必要なデータだけを必要な特定の形式で渡すことになっています。ビューのDTOを作成する必要があります。このパターンは、ドメインモデルとは対照的に、ビューモデルとも呼ばれます。

あなたの生活を楽にするために、ドメインモデルオブジェクトからビューモデルオブジェクトに自動マップして戻すライブラリやフレームワークがあるかもしれません。 .NETには、現在開発中のAutoMapperと呼ばれるオープンソースのフレームワークがあります。私はJavaのために何があるか分かりません。

+1

私はDozerがDTOとの間でJavaドメインオブジェクトの自動マッピングを行うと信じていますが、自分自身を使ったことはありません。 –

関連する問題