我正在寻找从JPA实体创建数据传输对象(DTO)的好方法,反之亦然.
我想将DTO作为
JSON发送给客户端,然后接收修改的DTO并将其保存回数据库.
在从DOM接收到的对象被解析为Java类之后,从接收到的对象的EntityManager执行合并方法是最容易的.
例如,存在以下实体和用于保存修改的对象的Rest方法:
@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 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合并到数据库中的问题. (也许这个代码可以自动生成)
例如,Entity 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进行合并.