この質問で説明されているように、HibernateエンティティとWebサービスによって返されるデータ転送オブジェクトの間で変換する方法について同様の質問と懸念がありました。
ejb3でデータ転送オブジェクトを使用していることがベストプラクティスと見なされています
ここで言及されている要因の1つは、ドメインモデルが変更された場合、一連のDTOがWebサービスの場合に消費者を保護することです。
私のプロジェクトにかなりの量のコードが追加されるように見えますが、この推論は正しいようです。
Hibernateエンティティ(インターフェイスを実装する)を同じインターフェイスを実装するDTOに変換するために使用できる優れたデザインパターンはありますか?
したがって、次の両方が「Book」を実装すると仮定すると、JAXBをシリアル化して返すことができるように、BookEntity.classをBookDTO.classに変換する必要があります。
繰り返しになりますが、この全体的な見通しは私には疑わしいようですが、この変換に対処するのに役立つ良いパターンがそこにある場合は、いくつかの洞察を得たいと思います。
リフレクションを介して変換する興味深い方法はおそらくありますか?または、私が考えていない「ビルダー」パターン?
DTOパターンを無視して、エンティティを渡す必要がありますか?
DTOパターンを無視して、エンティティを渡す必要がありますか?
私の好みは通常「はい」です。アーキテクチャまたはレイヤーの純度のためだけに作成された並列階層のアイデアは好きではありません。
DTOパターンの元々の理由は、エンティティEJBをビュー層に渡すときのEJB1.0および2.0アプリの過度のチャットでした。解決策は、エンティティBeanの状態をDTOに入れることでした。
DTOを作成するために通常与えられるもう1つの理由は、ビューレイヤーによる変更を禁止することです。その場合、DTOは不変のオブジェクトであり、動作はありません。データをビューレイヤーに転送するだけです。
DTOは、アンチパターンになっているコアJ2EEパターンであると私は主張します。
反対する人もいると思います。私は単に私の意見を提供しています。それを行う唯一の方法ではなく、必ずしも「正しい」方法でもありません。それは私の好みです。
DTOのすべての陽気なキックの中には逆張りの見方が必要です。
tl; dr-それでも役立つ場合があります。
DTOの利点は、ドメインクラスに無数のアノテーションを追加する必要がないことです。
@Entityから始めます。そんなに悪くない。ただし、JAXBが必要なので、@ XMLElementなどを追加します。次に、JSONが必要なので、Jacksonの@JsonManagedReferenceなどを追加して、関係を正しく処理してから、などを無限に追加します。
間もなく、POJOはそれほど単純ではなくなります。いつか「ドメイン駆動設計」について読んでください。
さらに、ビューに認識させたくないいくつかのプロパティを「フィルタリング」することができます。
エンティティオブジェクトは、管理された状態では扱いにくいことを忘れてはなりません。これにより、GUIフォームへの受け渡しが問題になります。より正確には、子オブジェクトは熱心に処理されます。これは、例外を引き起こして、セッション外で行うことはできません。したがって、それらはエンティティマネージャから削除(デタッチ)される必要があり、適切なDTOに変換される必要があります。コースがない限り、私が気付いていないパターンがあり、それを知ってとてもうれしいです。
重複するget/setコードを大量に使用せずに、「類似」DTOをすばやく作成するには、 BeanUtils.copyProperties を使用できます。この関数は、DAOからDTOクラスにデータをすばやくコピーするのに役立ちます。 BeanUtils.copyPropertiesをサポートする共通ライブラリが複数あることを覚えておいてください。ただし、それらの構文は同じではありません。
これは古い質問ですが、他の誰かがこの問題に取り組んでいる場合に役立つフレームワークを提供する回答を追加すると思いました。
私たちのプロジェクトには、JPA注釈付きPOJOとは別のJAXB注釈付きPOJOがあります。私たちのチームは、2つのオブジェクト(実際にはデータ構造)間でデータを移動する最善の方法について議論していました。
人々が検討するためのオプションは次のとおりです。
2つのPOJO間でデータをコピーする方法として、(1)同じ名前、(2)XMLマッピング、および(3)カスタム変換を処理する Dozer を見つけて実験しています。
これまでのところ、非常に使いやすいです。