一尘不染

休眠:单表中的父/子关系

hibernate

关于以下与Hibernate有关的问题,我几乎看不到任何指针。这涉及到使用具有自身父子关系的单个数据库表来实现继承。例如:

CREATE TABLE Employee (
  empId BIGINT NOT NULL AUTO_INCREMENT,
  empName VARCHAR(100) NOT NULL,
  managerId BIGINT,
  CONSTRAINT pk_employee PRIMARY KEY (empId)
)

在这里, managerId 列可以为null,或者可以指向 Employee
表的另一行。业务规则要求员工了解他的所有报告人以及他/她的经理。业务规则还允许行具有为空的 managerId (组织的CEO没有经理)。

我们如何在Hibernate中映射此关系,标准多对一关系在这里不起作用?特别是,如果我不仅要实现我的实体作为相应的“雇员”实体类,而且要实现多个类,例如“经理”,“助手管理器”,“工程师”等,每个类都继承自“雇员”超级实体类,某些实体的属性实际上并不适用于所有实体,例如“
Manager”获得了Perks,而其他实体则没有(相应的表列当然会接受null)。

示例代码将不胜感激(我打算使用Hibernate 3注释)。


阅读 255

收藏
2020-06-20

共1个答案

一尘不染

您在这里表达两个概念:

  1. 继承,并且您想要在单个表中映射继承层次结构。
  2. 父母/子女关系。

要实现1.,您需要使用每个类层次结构策略的Hibernate
单个表

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
    name="emptype",
    discriminatorType=DiscriminatorType.STRING
)
public abstract class Employee { ... }

@Entity
@DiscriminatorValue("MGR")
public class Manager extends Employee { ... }

要实现2.,您需要在上添加两个自引用关联Employee

  • 许多员工有零个或一个经理(也是Employee
  • 一名员工的报告人为零或很多

结果Employee可能如下所示:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
    name="emptype",
    discriminatorType=DiscriminatorType.STRING
)
public abstract class Employee {

    ...

    private Employee manager;
    private Set<Employee> reportees = new HashSet<Employee>();

    @ManyToOne(optional = true)
    public Employee getManager() {
        return manager;
    }

    @OneToMany
    public Set<Employee> getReportees() {
        return reportees;
    }

    ...
}

这将导致下表:

CREATE TABLE EMPLOYEE_EMPLOYEE (
        EMPLOYEE_ID BIGINT NOT NULL,
        REPORTEES_ID BIGINT NOT NULL
    );

CREATE TABLE EMPLOYEE (
        EMPTYPE VARCHAR(31) NOT NULL,
        ID BIGINT NOT NULL,
        NAME VARCHAR(255),
        MANAGER_ID BIGINT
    );

ALTER TABLE EMPLOYEE ADD CONSTRAINT SQL100311183749050 PRIMARY KEY (ID);

ALTER TABLE EMPLOYEE_EMPLOYEE ADD CONSTRAINT SQL100311183356150 PRIMARY KEY (EMPLOYEE_ID, REPORTEES_ID);

ALTER TABLE EMPLOYEE ADD CONSTRAINT FK4AFD4ACE7887BF92 FOREIGN KEY (MANAGER_ID)
    REFERENCES EMPLOYEE (ID);

ALTER TABLE EMPLOYEE_EMPLOYEE ADD CONSTRAINT FKDFD1791F25AA2BE0 FOREIGN KEY (REPORTEES_ID)
    REFERENCES EMPLOYEE (ID);

ALTER TABLE EMPLOYEE_EMPLOYEE ADD CONSTRAINT FKDFD1791F1A4AFCF1 FOREIGN KEY (EMPLOYEE_ID)
    REFERENCES EMPLOYEE (ID);
2020-06-20