首页 > 解决方案 > 在 JPA 中将多个表映射到单个实体

问题描述

我正在尝试学习 JPA/Hibernate,我在这个领域是真正的新手。我通常倾向于在对 API 了解不多的情况下转而尝试一些事情。所以我决定创建一个简单的实体来从多个表中检索信息,这很容易用 JPA 实现。这背后的原因是,假设每个涉及的表有几百列,而我们只有业务需要检索很少的数据,我们只需要专注于检索而不是插入/更新/删除,我会假设最好只检索整个实体(特别是如果需要返回多行),然后将它们连接到其他实体以派生几列。

我从两个简单的表开始:

EMPLOYEES
EMPLOYEE_ID, EMAIL, DEPARTMENT_ID, MANAGER_ID, FIRST_NAME, etc...

DEPARTMENTS
DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, etc...

我希望我的实体仅根据以下内容检索以下列EMPLOYEES.EMPLOYEE_ID

EMPLOYEES.EMPLOYEE_ID
EMPLOYEES.MANAGER_ID
EMPLOYEES.DEPARTMENT_ID
DEPARTMENT.DEPARTMENT_NAME

这里要注意的一件事是,它EMPLOYEES.MANAGER_ID是一个自引用的外键EMPLOYEES.EMPLOYEE_ID

我可能会创建以下...

@SecondaryTable(name="DEPARTMENTS",
    pkJoinColumns=@PrimaryKeyJoinColumn(name="managerId",referencedColumnName="employeeId")
)
@Table(name="EMPLOYEES")
@Entity
public class EmployeesDepartment {

    @Id
    private String employeeId;

    private String managerId;

    private String email;

    private int departmentId;

    @Column(name="DEPARTMENT_NAME",table="DEPARTMENTS")
    private String departmentDesc;

// Setters and getters
}

显然这并没有给我们正确的答案,因为辅助表 ( DEPARTMENTS) 之间的连接发生在它的MANAGER_IDand之间EMPLOYEES.EMPLOYEE_ID,而不是DEPARTMENTS.MANAGER_ID = EMPLOYEES.MANAGER_ID.

我不能替换referencedColumnName="employeeId"referencedColumnName="managerId"managerId of @Entity EmployeesDepartmentis not a primary key of EMPLOYEES

而且我不能执行以下操作:

@OneToOne
@JoinColumn(name="managerId",table="DEPARTMENTS",referencedColumnName="employeeId")
private String managerId;

DEPARTMENTS.MANAGER_ID = EMPLOYEES.MANAGER_ID我的问题是,当查询的WHERE子句基于时,我怎样才能使我的加入开启EMPLOYEES.EMPLOYEE.ID?换句话说,我怎样才能拥有映射到以下查询的实体:

SELECT
  E.EMPLOYEE_ID,
  E.MANAGER_ID,
  E.DEPARTMENT_ID,
  D.DEPARTMENT_NAME
FROM EMPLOYEES E LEFT OUTER JOIN DEPARTMENTS D ON E.MANAGER_ID = D.MANAGER_ID
WHERE E.EMPLOYEE_ID = ?

或者有没有副作用更少的更好的解决方案,例如表的更新顺序、加载等?

标签: javahibernatejpaspring-data-jpaentity

解决方案


推荐阅读