2017-02-14 10 views
0

私はエンティティのモデリングに少し矛盾しています。@Transient vs decorator

私たちは約6〜8個のインスタンス変数を持つエンティティを持っています。それらのうちの2つは実際にはデータベースに保持されず、検証やUIでの表示にのみ使用されます。したがって、エンティティを取得するときに、外部ルックアップが設定されます。

今、私の同僚の一人によると、@Transientを使用するよりも、デコレータを使用する方が優れています。ある程度、私は同意する。 DBが表す実際のモデルを明らかにしているからです。

しかし、それはいくつかのケースのための追加の定型(私はMyEntityBOとしてエンティティに名前を付けることができ、ビジネス用などを追加します。しかし、私はUIのためにそれを使用する場合...再び少し混乱される名前になります。

私の質問は、何がありますシナリオは@Transientをデコレータではなくデコレータを使用する方が良い、またはその逆を使用する方が良い

+1

のために必要な追加のフィールドやメソッドを作成することはできませんオブジェクト。その理由から、UIから直接エンティティを使用すべきではありません。むしろ、ビューに特化したモデルの表現であるビュー固有のモデルを用意する必要があります。そのビューモデルはUIに属します。ビューモデルは元のモデルを合成してカプセル化することができますが、それはデコレータ自体ではありません。それはあなたのアプリケーションが単純なCRUDでない限り、その場合は@Transientと一緒に行くだけです。 – plalx

+0

サンプルコードを表示してデコレータパターンをここに追加する方法を教えてください。 –

+0

@plalx私の場合は、必ずしもUIではありません。オブジェクトは他の検証にも使用されます。このような状況に対処するには、より良い方法が考えられます。 2オブジェクトを作成します。 ObjectUI、ObjectBO UIに必要なものをゲッターだけで手に入れることができます。誤ってUIには表示すべきではなく、メインのエンティティにそこにあるべきもの。 ID /パスワードを隠すことができます。 (ここでも反対の議論は "@IgnoreJson"です:)私は "@Transient"がまだ実行可能な場合を理解しようとしています。あなたのようにアプリケーションがCRUDだけだと言ったら、 "@Transient"を持つ方が理にかなっています –

答えて

0

これは、エンティティをDBマッピングとUIマップの両方に使用するための良い方法ではありません。 ping。常に単一責任の原則について考える。エンティティはDBマッピングのみを担当する必要があります。 UI表現用のDTOレイヤーを作成する必要があります。しかし、この場合はコンバータを作成する必要があります、それは退屈です、私はMapstruct - http://mapstruct.orgを使用することを提案します。 @Transientを使用する必要がある場合、これは間違っている最初の兆候です。心に留めておいてください。幸運:)

@Entity 
public class User { 
    @Id 
    Long id; 
    String name; 
} 

public class UserDto{ 
    Long id; 
    String name; 
} 

public class UserConverter{ 
    public UserDto toDto(User user) { 
     if (user == null) return null; 
     UserDto dto = new UserDto(); 
     dto.setId(user.getId()); 
     dto.setName(user.getName()); 
     return dto; 
    } 

    public User toEntity(UserDto dto){...} 
} 

そして、DTO中には、あなたはどちらもあなたには、いくつかの目的

+0

号の問題はこのDTOを維持することである。不要な冗長コードが作成されます。しかし、私がそれを合成すると、それはより保守的になります。私の疑問は、エンティティがDB構造をマップすることになっていたのであれば、なぜそれらを作成したのかという "@Transient"についてでしたか?それに対する動機は何ですか?どこでこれを使うのがより現実的か...しかし、私は今、理解しています。 –

+0

ラッパーを使用することはお勧めしません。あなたはdao層、サービス層、およびUI層を分離する必要があります。理想的には、dbからオブジェクトを取得し、ビジネスロジックを実行し、必要なオブジェクトをUI側で作成して送信する必要があります。ラッパーを送信すると、エンティティがラッパーオブジェクト内にあることを意味します。これは間違っています。つまり、ドメインオブジェクトをUIに送信するからです。また、LazyInitExceptionも発生する可能性があります。これは、分離されたエンティティがUIに送信されたためです。完全に構築されたDTOオブジェクトをUIに送信する必要があります。実際にはDTOパターンは、LazyInitExceptionを処理する最良の方法の1つです。 – idmitriev

+0

あなたのアーキテクチャについて考えてみましょう。あなたのレイヤーは結合されていて、独自のデータで作業する必要があります。 DTOにはメソッドがない場合は完璧です。単なるダムデータです。 UIはそのデータを処理します – idmitriev

-1

デコレータパターンを使用する主な欠点は、コードのメンテナンスが問題になることです(私の経験から) @Transient

+0

"コードのメンテナンス"について少し詳しく説明できますか?あなたがどこに問題を起こしたか、あなたが見た、どんな問題か卑猥なこと? –

+0

私たちのプロジェクトでは、Decaratorパターンには多くのシミュレータの種類のオブジェクトがありました。メンテナンス中は頭痛になります。移行する予定がある場合(一時的なパターンよりも不便です)、オブジェクトの数が少なければ私は自分自身の問題に直面していたので、提案した。 – Akshay

関連する問題