2

SpringMVC、JPA2を使用して簡単なフォーラムWebアプリケーションを開発しています。DBテーブル構造を反映するUser、Forum、PostなどのJPAエンティティを作成しました。

ただし、UIにデータを表示するときは、エンティティを使用してUIに表示するデータを常に保持できるとは限らないため、DTOが必要です。

例:パスワードの変更画面。ここでは、古いパスワード、新しいパスワードを保持し、新しいパスワードを確認する必要があります。ただし、ユーザーエンティティにはOld / New / Confirm Pwdフィールドはなく、Passwordだけがあります。したがって、Webレイヤーとサービスレイヤーの間の単なるデータキャリアであるDTOを作成する必要があります。

私の質問は、DTOオブジェクトの作成中に、すべてのプロパティをDTO自体に配置するか、エンティティをDTOでラップして、必要な追加のプロパティを追加する必要があるかということです。

例:ユーザー画面の編集の場合、

public class UserDTO
{
     private User user; // User is a JPA entity
     // setters & getters
}

これにより、基盤となるUserエンティティをサービスレイヤーに渡すことができます。ただし、UIプロパティをDTOにバインドするときに、PropertyEditorsを関連付ける必要があります。

(また)

public class UserDTO
{
    private String userId;
    private String userName;
    private String password;
    // setters & getters
}

このアプローチでは、DTOプロパティをJPAエンティティに変換してコピーし、サービスレイヤーに渡す必要があります。

どちらのアプローチが良いですか?または、DTOをまったく使用しない他のアプローチはありますか?

4

1 に答える 1

0

最初のアプローチでも、エンティティオブジェクト自体がプレゼンテーション層に運ばれます。データベースから取得されていない追加のパラメーターがあり、永続コンテキストが引き続き使用可能な場合は、このアプローチで十分です。

2番目のアプローチでは、コードの複製が必要ですが、これは理想的ではありません。

永続コンテキストが利用できない場合は、Beanの並列階層を作成するのではなく、EntityManager.detach()を使用して永続コンテキストからエンティティをデタッチすることをお勧めします。

一方、データがプレゼンテーション層から入ってくる場合は、データベースからエンティティをロードして(find()などを使用して)更新するか、永続コンテキストにマージ()する必要があります。

于 2012-07-31T05:40:08.107 に答える