我正在尋找一種從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並接收整個實體。然後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複製回實際實體那樣的東西,可以將它們與EntityManager合併。
爲了節省一些代碼行你可以使用apache commons-BeanUtils庫。在這裏看看http://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/BeanUtils.html它有實用的方法,從pojo複製屬性到反射 – gipinani