冬眠エンティティとデータ転送オブジェクトを変換するための良いパターンは何ですか?
-
14-10-2019 - |
質問
この質問で説明するように、Webサービスによって返される冬眠エンティティとデータ転送オブジェクト間を変換する方法についても同様の質問や懸念がありました。
ベストプラクティスと見なされるejb3でデータ転送オブジェクトを使用しています
ここで言及されている要因の1つは、ドメインモデルが変更された場合、DTOのセットがWebサービスの場合に消費者を保護することです。
私のプロジェクトにかなりの量のコードを追加するように思われますが、この推論は健全のようです。
同じインターフェイスを実装するHibernateエンティティ(インターフェイスを実装する)をDTOに変換するために使用できる優れたデザインパターンはありますか?
したがって、次の両方の「book」を実装すると仮定すると、bookentity.classをbookdto.classに変換して、jaxbをシリアル化して返すことができます。
繰り返しますが、この見通し全体は私には疑わしいように思えますが、この回心に対処するのに役立つ良いパターンがあるなら、私は洞察を得たいと思っています。
反射を介して変換する興味深い方法はおそらくありますか?または、私が考えていない「ビルダー」パターン?
DTOパターンを無視し、エンティティを渡すだけですか?
解決
DTOパターンを無視し、エンティティを渡すだけですか?
私の好みは通常「はい」です。私は、建築または層の純度のためだけに作成された並列階層のアイデアが好きではありません。
DTOパターンの当初の理由は、EJB 1.0および2.0のアプリでの過度のおしゃべりさでした。解決策は、エンティティビーンステートをDTOに入れることでした。
通常、DTOを作成するために与えられるもう1つの理由は、ビューレイヤーによる変更を禁止することです。 DTOは、その場合は動作がなく、不変のオブジェクトです。彼らはビューレイヤーにフェリーデータ以外に何もしません。
私は、DTOがアンチパターンになるコアJ2EEパターンであると主張します。
一部の人々は同意しないことに気付きます。私は単に自分の意見を提供しています。それがそれを行う唯一の方法ではなく、必ずしも「正しい」方法でもありません。それは私の好みです。
他のヒント
DTOのすべての陽気な蹴りの間に逆の見解が必要です。
tl; dr-それは時々まだ便利です。
DTOの利点は、ドメインクラスに無数の注釈を追加する必要がないことです。
@Entityから始めます。そんなに悪くない。しかし、jaxbが必要なので、@xmlelementなどを追加してからJSONが必要なので、Jacksonのようなものを追加して、関係で正しいことをしてから、追加するなどを追加します。
すぐにあなたのポジョはもうそれほど明白ではありません。いつか「ドメイン駆動型のデザイン」について読んでください。
さらに、ビューに知りたくないプロパティを「フィルタリング」できます。
エンティティオブジェクトが管理された状態にある場合、エンティティオブジェクトが簡単に処理できないことを忘れてはなりません。これにより、GUIフォームへの亡くなったことが問題になります。より正確には、子のオブジェクトは熱心に処理されます。これは、セッションを終了することはできませんが、例外を除いて。したがって、彼らは、適切なDTOに変換する必要があるエンティティマネージャーから追い出される必要があります。クルスがない限り、私は知りませんが、私が知っていてとてもうれしいパターンがあります。
get/setコードを重複せずに「見栄えのような」dtoをすばやく作成するには、使用できます Beanutils.CopyProperties. 。その関数は、DAOからDTOクラスにデータをすばやくコピーするのに役立ちます。 beanutils.copypropertiesをサポートする一般的なライブラリが複数あることを覚えておいてください。しかし、それらの構文は同じではありません。
私はこれが古い質問であることを知っていますが、他の誰かがこの問題に取り組んでいる場合に役立つフレームワークを提供する答えを追加すると思いました。
私たちのプロジェクトには、JPA注釈付きポジョとは別のJaxB注釈付きポジョがあります。私たちのチームは、2つのオブジェクト(実際にはデータ構造)間でデータを移動するのが最善の方法について議論していました。
これが人々が考慮するオプションです:
私たちは見つけて実験しています ドーザー (1)同じ名前、(2)XMLマッピング、および(3)2つのPOJO間でデータをコピーする方法としてカスタム変換を処理します。
これまでのところ非常に使いやすいです。