JPA 模式:从实体生成数据传输对象 DTO 并将 DTO 合并到数据库
我正在寻找一种从JPA实体创建数据传输对象(DTO)的好方法,反之亦然。我想将 DTO 作为 JSON 发送到客户端,然后接收修改后的 DTO 并将其保存回数据库。在接收的对象从 JSON 解析为其 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<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 类相同的表,但仅提供客户的名称和地址。它是真实客户类的 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合并。