关于以下与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注释)。
您在这里表达两个概念:
要实现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);