21

この質問で説明されているように、HibernateエンティティとWebサービスによって返されるデータ転送オブジェクトの間で変換する方法について同様の質問と懸念がありました。

ベストプラクティスと見なされるejb3でデータ転送オブジェクトを使用しています

ここで言及されている要因の1つは、ドメインモデルが変更された場合、一連のDTOがWebサービスの場合に消費者を保護することです。

私のプロジェクトにかなりの量のコードが追加されるように見えますが、この推論は正しいようです。

Hibernateエンティティ(インターフェイスを実装する)を同じインターフェイスを実装するDTOに変換するために使用できる優れたデザインパターンはありますか?

したがって、次の両方が「Book」を実装すると仮定すると、JAXBをシリアル化して返すことができるように、BookEntity.classをBookDTO.classに変換する必要があります。

繰り返しになりますが、この見通し全体は私には疑わしいようですが、この変換に対処するのに役立つ良いパターンがそこにある場合は、いくつかの洞察を得たいと思います。

リフレクションを介して変換するための興味深い方法はありますか?または、私が考えていない「ビルダー」パターン?

DTOパターンを無視して、エンティティを渡す必要がありますか?

4

5 に答える 5

17

DTOパターンを無視して、エンティティを渡す必要がありますか?

私の好みは通常「はい」です。アーキテクチャまたはレイヤーの純度のためだけに作成された並列階層のアイデアは好きではありません。

DTOパターンの元々の理由は、エンティティEJBをビュー層に渡すときのEJB1.0および2.0アプリでの過度のおしゃべりでした。解決策は、エンティティBeanの状態をDTOに入れることでした。

DTOを作成するために通常与えられるもう1つの理由は、ビューレイヤーによる変更を禁止することです。その場合、DTOは不変のオブジェクトであり、動作はありません。データをビューレイヤーに転送するだけです。

DTOは、アンチパターンになっているコアJ2EEパターンであると私は主張します。

反対する人もいると思います。私は単に私の意見を提供しています。それを行う唯一の方法ではなく、必ずしも「正しい」方法でもありません。それは私の好みです。

于 2010-12-29T22:02:32.870 に答える
14

DTOのすべての陽気なキックの中には逆張りの見方が必要です。

tl;dr-それでも役立つ場合があります。

DTOの利点は、ドメインクラスに無数のアノテーションを追加する必要がないことです。

@Entityから始めます。そんなに悪くない。ただし、JAXBが必要なので@XMLElementなどを追加します。次にJSONが必要なので、Jacksonの@JsonManagedReferenceなどを追加して、関係を正しく処理してから、などを無限に追加します。

間もなく、POJOはそれほど単純ではなくなります。いつか「ドメイン駆動設計」について読んでください。

さらに、ビューに知らせたくないいくつかのプロパティを「フィルタリング」することができます。

于 2011-07-26T16:27:13.517 に答える
5

エンティティオブジェクトが管理された状態にある場合、それらを処理するのは簡単ではないことを忘れてはなりません。これにより、GUIフォームへの受け渡しが問題になります。より正確には、子オブジェクトは熱心に処理されます。これはセッション外では実行できず、例外が発生します。したがって、それらはエンティティマネージャから削除(切り離され)される必要があり、適切なDTOに変換される必要があります。コースがない限り、私が気付いていないパターンがあり、それを知ってとてもうれしく思います。

于 2011-09-26T11:42:04.683 に答える
4

重複するget/setコードを大量に使用せずに、「類似」DTOをすばやく作成するには、BeanUtils.copyPropertiesを使用できます。この関数は、DAOからDTOクラスにデータをすばやくコピーするのに役立ちます。BeanUtils.copyPropertiesをサポートする一般的なライブラリは複数ありますが、それらの構文は同じではないことに注意してください。

于 2012-08-12T23:58:32.580 に答える
2

これは古い質問ですが、他の誰かがこの問題に取り組んでいる場合に役立つフレームワークを提供する回答を追加すると思いました。

私たちのプロジェクトには、JPA注釈付きPOJOとは別のJAXB注釈付きPOJOがあります。私たちのチームは、2つのオブジェクト(実際にはデータ構造)間でデータを移動する最善の方法について議論していました。

人々が検討するためのオプションは次のとおりです。

2つのPOJO間でデータをコピーする方法として、(1)同じ名前、(2)XMLマッピング、および(3)カスタム変換を処理するDozerを見つけて、実験しています。

これまでのところ非常に使いやすいです。

于 2015-02-10T23:14:41.147 に答える