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注释).
你在这里表达两个概念:
要实现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)
| 归档时间: |
|
| 查看次数: |
23910 次 |
| 最近记录: |