2016-09-22 1 views
0

エンティティクラス "classA"とモデルクラス "ClassA1"があります。 ClassAは、サーバ側からmysqlデータベースに値を格納するために使用され、ClassA1は、API応答文字列をクライアント側のオブジェクトに変換するために使用されます。Javaクラスをエンティティとしてもモデルとしても使用する方法

同じgetterとsetterを持つ2つのJavaクラスがありますが、ClassAには休止状態の注釈が含まれており、ClassA1は単なるPOJOです。

public class ClassA1 { 
    private int id; 
    private String name; 

    public int getId() { 
     return id 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

ClassA1.java

@Entity 
@Table(name="classA") 
public class ClassA { 
    @Id 
    private int id; 
    private String name; 

    public int getId() { 
     return id 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @Column(name="name") 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

ClassA.java以下のクラス構造に

を考えてみましょう私のアプリケーションは、上記のようなクラスの多くの数をcontaingています。データベースに列を追加すると、ClassA1とClassA1の両方にゲッターとセッターが追加されているので、これを避けたいと思います。

サーバー側とクライアント側の両方のモジュールに単一のクラスを使用する方法はありますか?

+1

あなたは同じものとして両方を持つことに直面している問題は何ですか? –

+0

同じクラスを使用すると、クライアント側のモデルもjpa関連のコードを読み込みます。実際には必要ありません。 – Achaius

+0

@Achaius JPA関連のコードはどのようなものが読み込まれていますか? –

答えて

1

両方の状況で同じクラスを使用することができます。それは動作するはずです。これは私の以前のプロジェクトの始めに試した方法です。クライアント側から受け取ったClassAのJPAマージを慎重に処理できるのであれば、それを独立したエンティティとして扱うことができます。

エンティティの設計が複雑になると、多くの問題に直面します(これが私のプロジェクトでこのアプローチから離れた理由です:P)。最大の問題の1つは、エンティティの関係をモデル化しているため、一度クライアント用にシリアライズしようとすると、(JAXBなど、プロジェクトをやっていた時に)たくさんのソリューションが再帰的にトレースされますすべての関係とそれを変換しようとします。このような振る舞いは、エンティティの大量の怠惰なフェッチを引き起こし、その結果にシリアル化されたフォームに膨大な(未使用の)データが含まれるようにします。アノテーションなどを無視して動作を制御することはできますが、結果のエンティティは維持管理が面倒になります。

あなたがしていることは、イホは、不合理ではありません。あなたが気をつける必要があるのは、値オブジェクト( "モデル"と呼ばれるもの)を "プレゼンテーション"のために扱うことです。エンティティと厳密に同じにする必要はありません。

エンティティから値オブジェクトの構築を処理し、値オブジェクトからエンティティにデータを戻すために、いくつかのutilライブラリを使用/開発します。

もちろん、あなたのアーキテクチャーをあまり共有していなければ、あなたには当てはまらないかもしれません。

1

アノテーションを使用する代わりに、XMLファイルでHibernateマッピングを個別に指定することができます。これはこれを行う古い方法ですが、現在はほとんどの人がアノテーションを使用しています。なぜなら、JPA標準(主に)に準拠していて便利なためです。

もう1つの解決策は、DozerのようなBeanマッピングフレームワークを使用してマッピングを簡単にすることです。

アーキテクチャ内のビューで使用される永続的な(JPA)エンティティと値オブジェクトを分離することはよくあります。それらが使用されているビューの値オブジェクトをカスタマイズすることができます。おそらく、ビューには完全なUserエンティティは必要なく、ID、名前、およびアドレスのみが必要ですか?この場合、ビューとバックエンドの間の通信がより軽くなり、ValueObjectと永続エンティティの間の重複が部分的に解決されます。

関連する問題