2012-04-03 7 views
1

私は自分では解決できない問題に直面していますので、私はあなたの助けを求めています。問題は次のとおりです。 永続性レイヤーをアップグレードする必要があります。以前はJDBCを使ってデータにアクセスしていましたが、今はJPAを使用するべきです。つまり、新しいオブジェクトでデータが取得されるようになりましたが、システムは古いオブジェクトで動作します。したがって、古いエンティティと新しいエンティティの間にいくつかのコンバータを記述する必要があります。しかし、問題は時には古いものから新しいエンティティを形成するためにいくつかの追加情報が必要なことです。たとえば:オブジェクトコンバータを作成するためのベストプラクティス

class OldEntity{ 
    private int id; 
    // old entity contains only foreign key 
    private int otherEntityId; 
    ... 
} 

class NewEntity{ 
    private int id; 
    // new entity contains object that associated with foreign key 
    private OtherEntity otherEntity; 
    ... 
} 

我々は、すべてのコンバータにいくつかの一般的なインタフェースを追加したいが、我々は新しいものに古いエンティティから変換する場合、まず、私たちはそのidで「otherEntity」を取得し、コンバータにそれを与える必要があります。構造が異なる多くのエンティティがあるので、コンバータのメソッドは、新しいエンティティを形成するためにさまざまな数の異なるパラメータを受け取る必要があります。 問題は、このような問題に対する優れたアーキテクチャソリューションはありますか?

+0

どのように追加情報を取得しますか?ユーザーにダイアログボックスをポップアップしますか? –

+0

いいえデータベースから外部キー値で検索されます。例のクラスの場合と同様に、古いエンティティには外部キー値しかなく、新しいオブジェクトのidで取り出されたオブジェクト全体を埋めたいとします。私はコンバータのメソッドの中でそれを取得することは悪い考えだと思うので、私は適切なコンバータのメソッドにそのような検索オブジェクトを与えるためのより良い方法を探しています。 –

+0

マッピングを設定して古いエンティティを生成し、コンバーターを必要としない方法はありませんか? –

答えて

1

これはAdapter Patternの仕事のようです。アプリケーションではOldEntitiesが必要ですが、永続性はNewEntitiesによって管理されるため、OldEntitiesとNewEntitiesの間の変換を管理するアダプタが必要です。

次に、ドメインモデルのすべてのエンティティ用にアダプタを作成する必要があります。彼らは次のようになります:

class NewEntityAdapter extends OldEntity{ 
    private NewEntity newEntity; 

    //This is an overriden method 
    public int getOtherEntityId(){ 
     return newEntity.getOtherEntity().getId(); 

} 
+0

はい。それは良い解決策ですが、私が別の方向に変換しようとすると、問題は解決しません。内部の情報量が少なくて済み、古いエンティティを新しいエンティティから取得するのは簡単です。しかし、私が古いものから新しいエンティティを作成したいのであれば、私はどこかの追加情報を取得して変換するメソッドに渡す必要があります。私はアダプタの中でそれを取得することは良い考えではないと思う。 –

+0

サービスレイヤを使用していますか?サービス層は、古いエンティティに含まれるID情報に基づいてNewEntityインスタンスを取得するようにDAOレイヤに依頼するのに適しています。そのトランザクションサポートのため、私はあなたがそのような操作を行うことができる最良の場所だと思います。 –

+0

すべての会話はサービスレイヤーで行う必要があり、そこですべての要件データを取得できます。しかし、異なるエンティティはアダプタのコンストラクタまたはコンバーターメソッドに与えられるべきこのような追加のパラメータの数が異なるため、それはちょっと混乱しているように思えます。私はアダプターのアプローチが好きではありません。追加のクラスがたくさんあるからです。私の考えは、いくつかの一般的なインターフェイスを持つコンバータを作成することでした。ここでの問題は、コンバータのメソッドにそのパラメータを与える方法です。悪いが便利なアプローチの1つは、Mapを使用して追加のパラメータを設定することです。 –

1

これは試すことができます。

public interface IBaseEntity{ 

    public int getId(); 

} 

public class OldEntity implements IBaseEntity{ 
    public int getId(){ 
     return id; 
    } 
} 

public class NewEntity{ 
    IBaseEntity entity; 
    public NewEntity(IBaseEntity entity){ 
     this.entity=entity; 
    } 
    public int getId(){ 
     return entity.getId(); 
    } 
} 
+0

ありがとう!それは実行可能な解決策です。しかし、エンティティクラスの外に変換ロジックを移動するためには、コンバーターが本当に必要です。 –

関連する問題