如何使用DTO管理多对一的jpa以进行保存和查找数据

时间:2019-07-05 08:22:14

标签: java spring spring-boot jpa spring-data-jpa

我有两个表具有多对一关系。例如,我有Office表和Employee表。一名雇员属于一个办公室,而一个办公室属于许多雇员。

办公室

@Entity(name = "office")
@Table(name = "office", uniqueConstraints = {@UniqueConstraint(columnNames = {"id"})})
public class Office {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "office_name", nullable = false)
    private String officeName;
}

员工

@Entity(name = "employee")
@Table(name = "employee", uniqueConstraints = {@UniqueConstraint(columnNames = {"id"})})
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "employee_name", nullable = false)
    private String employeeName;

    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
    @JoinColumn(name = "office_id", referencedColumnName = "id", nullable = false)
    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    private Office office;
}

OfficeDto

public class OfficeDto {

    private Long id;
    private String officeName;
}

EmployeeDto

public class EmployeeDto {

    private Long id;
    private String employeeName;
    private OfficeDto office;
}

通过上述定义entityDTO的方式,当我执行employee.findAll()时,JSON结果还包括办公室数据的详细信息。

我有什么方法可以实现(目标):

  1. 在保存新的employee时,我只需要提及id中的office
  2. findAll员工时,我可以选择是只id还是将整个对象交给客户。

由于目前的情况,我认为我需要定义两名员工DTO。第一个是包含整个办公室数据(如代码EmployeeDto),第二个是将private OfficeDto office替换为private int office

1 个答案:

答案 0 :(得分:1)

您可以通过投影解决的第二个问题:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections 或仅特定于DTO的映射器,可以使用mapstruct进行映射:http://mapstruct.org/documentation/installation/

对于第一个问题,我在堆栈中找到了一些答案,但是您需要验证一下:JPA many-to-one relation - need to save only Id