JPAエンティティからデータ転送オブジェクト(DTO)を作成する良い方法を探しています。 DTOをJSONとしてクライアントに送信し、変更されたDTOを受信してデータベースに保存したいとします。 JSONからJavaクラスに解析された後、受信したオブジェクトのEntityManagerからマージメソッドを実行するのが最も簡単です。これは、限り、私のように全体のエンティティークラスを送って正常に動作JPAのパターン:エンティティからデータ転送オブジェクトDTOを生成し、DTOをデータベースにマージする
@Entity
@Table(name="CUSTOMER")
public class Customer {
@Id
Long id;
@Version
Long version;
String name;
String address;
String login;
String password;
String creditCardNumber;
@OneToMany(cascade = CascadeType.ALL)
List<Foo> fooList;
... Getter() and Setter()
}
private EntityManager em;
@POST
@Path("/saveCustomer")
public void saveCustomer (Customer customer) {
em.merge(customer);
return;
}
:
たとえば、次のエンティティと修正されたオブジェクトを保存するためのレスト方法がありますJSONを受け取り、Entity全体を戻します。次に、EntityManagerは変更されたオブジェクトをデータベースにマージします。エンティティのサブセットを作成するための最良の方法だろう何
:しかし、私は唯一の(名前のみと顧客の住所など)エンティティのサブセットを提供したいときに問題があるでしょうか?
- エンティティのDTOを手作業で書きますか?これにより、エンティティのすべてのサブセットに対して重複したコードが生成されます。これは維持する必要があります。
エンティティのサブセットであるDTOをデータベースにマージするにはどうすればいいですか?
- EntityManagerのmerge()メソッドを使用しても機能しません。最初はDTOはエンティティではないため、マージすることはできません。 DTOからエンティティを作成するだけで、エンティティにはいくつかの値が設定されていません。マージ後、値はデータベース内でNULLになります。私が思いついた
ひとつのアイデアは、私は実体を持っているしたい各サブセットのための追加エンティティを指定することでした。 (データベースビューのように)これは重複したコードですが、データベースへのDTOのマージに関する問題を解決することができます。 (そしておそらく、このコードが自動生成することができます)
例えばエンティティCustomerView1は、Customerクラスと同じテーブルにリンクが、唯一の顧客の名前と住所を提供します。実際のCustomerクラスのDTOです。これはJSONとして送信し、サーバーの外部で変更することができます。このクラスは、EntityManagerによってデータベースにマージすることもできます。
@Entity
@Table(name="CUSTOMER")
public class CustomerView1 {
@Id
Long id;
@Version
Long version;
String name;
String address;
... Getter() and Setter()
}
しかし、私はこのソリューションについての疑問を持って、私は、エンティティのJPAのキャッシングであれば、この意志の混乱を知っていないといくつかの問題を引き起こす可能性があります。
私の質問は、コードのDTOのための重複やデータベースに戻すのDTOをマージを解決するためのパターンがあり、ありますか?
この目的のためのライブラリはありますか? - DTOの自動生成やDTOを実際のEntityにコピーしてEntityManagerとマージすることができるようなもの。
いくつかのコード行を節約するために、apache commons-BeanUtilsライブラリを使用することができます。ここで見てくださいhttp://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/BeanUtils.htmlそれは、リフレクションを使ってpojoから/にプロパティをコピーするユーティリティメソッドを持っています – gipinani