我有两个表具有多对一关系。例如,我有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;
}
通过上述定义entity
和DTO
的方式,当我执行employee.findAll()
时,JSON结果还包括办公室数据的详细信息。
我有什么方法可以实现(目标):
employee
时,我只需要提及id
中的office
。findAll
员工时,我可以选择是只id
还是将整个对象交给客户。由于目前的情况,我认为我需要定义两名员工DTO
。第一个是包含整个办公室数据(如代码EmployeeDto
),第二个是将private OfficeDto office
替换为private int office
。
答案 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