gpt4 book ai didi

java - 如何管理多对一jpa以使用DTO保存和查找数据

转载 作者:行者123 更新时间:2023-12-02 09:43:05 25 4
gpt4 key购买 nike

我有两个具有多对一关系的表。示例是,我有 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;
}

员工D至

public class EmployeeDto {

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

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

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

  1. 保存新员工时,我只需提及办公室id即可。
  2. findAll员工时,我可以选择是否只将id传递给客户端,或者将整个对象传递给客户端。

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

最佳答案

通过投影可以解决的第二个问题: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

关于java - 如何管理多对一jpa以使用DTO保存和查找数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56899274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com