小编use*_*740的帖子

JPA的模式:从实体生成数据传输对象DTO并将DTO合并到数据库

我正在寻找一种从JPA实体创建数据传输对象(DTO)的好方法,反之亦然.我想将DTO作为JSON发送到客户端,然后接收修改后的DTO并将其保存回数据库.在从JSON解析为Java类之后,从接收到的对象上的EntityManager执行合并方法将是最容易的. 

例如,有以下Entity和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()
}
Run Code Online (Sandbox Code Playgroud)
private EntityManager em;
@POST
@Path("/saveCustomer")
public void saveCustomer ( Customer  customer)   {               
   em.merge(customer);
   return;
}  
Run Code Online (Sandbox Code Playgroud)

只要我将整个实体类作为JSON发送并接收整个实体,这样就可以正常工作.然后,EntityManager将修改后的对象合并到数据库中.但是当我只想提供实体的一个子集(比如只有客户的名称和地址)时,会出现问题:

  1. 创建实体子集的最佳方法是什么?

        - 手工编写实体的DTO?这将为实体的每个子集生成重复的代码,必须对其进行维护.

  2. 如何将作为实体子集的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() …
Run Code Online (Sandbox Code Playgroud)

java jpa dto entitymanager java-ee

17
推荐指数
1
解决办法
2万
查看次数

标签 统计

dto ×1

entitymanager ×1

java ×1

java-ee ×1

jpa ×1