Hibernate:单表中的父/子关系

Dch*_*cks 8 java orm hibernate single-table-inheritance

我几乎没有看到任何与Hibernate相关的问题的指针.这适用于使用具有父子关系的单个数据库表来实现继承.例如:

CREATE TABLE Employee (
  empId BIGINT NOT NULL AUTO_INCREMENT,
  empName VARCHAR(100) NOT NULL,
  managerId BIGINT,
  CONSTRAINT pk_employee PRIMARY KEY (empId)
)
Run Code Online (Sandbox Code Playgroud)

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

我们如何在Hibernate中映射这种关系,标准的多对一关系在这里不起作用?特别是,如果我想实现我的实体不仅作为相应的"Employee"实体类,而且实现多个类,例如"Manager","Assistant Manager","Engineer"等,每个类都继承自"Employee"超级实体类,某些实体具有实际上并不适用于所有的属性,例如"Manager"获取Perks,其他实体则不获取(相应的表列当然会接受null).

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

Pas*_*ent 9

你在这里表达两个概念:

  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 { ... }
Run Code Online (Sandbox Code Playgroud)

要实现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;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

这将导致以下表格:

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);
Run Code Online (Sandbox Code Playgroud)