当前位置: 首页 > 面试题库 >

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

裴浩歌
2023-03-14
问题内容

关于以下与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. 继承,并且您想要在单个表中映射继承层次结构。
  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);


 类似资料:
  • 问题内容: 如果我从父表中删除一条记录,我希望子表中的相应记录被删除。 如何从子表中删除Hibernate,而不是尝试使用null更新? 我正在使用Hibernate 3,但目前无法使用注释。我在下面附上了HBM,DAO等的副本。 - 先感谢您 尝试从父子关系中的表中删除数据时,出现以下错误: 我的表是: 家长 : 儿童: HBM XML 道 问题答案: 我遇到这个错误 所有 的时间。 只需在关系

  • 问题内容: 我正在尝试在Java应用程序中实现Hibernate持久层,但遇到了一些麻烦。每次尝试访问简单的单向关联时,我都会遇到无代理错误。我没有以正确的方式实现Hibernate- 我正在使用会话控制的线程方法,他们确实建议您不要将其用于生产。但是,他们在教程中使用它。我仍在尝试使基础知识正常运行,因此我认为按照教程进行操作是可以的。但是,我无法使用简单的关联来工作。我有一堂课,看起来像这样:

  • 问题内容: 我们正在将JPA与hibernate用作提供程序,我们有一个查询,该查询包含一个与FROM子句中的子查询的联接,但是会出现以下错误: org.hibernate.hql.ast.QuerySyntaxException:意外令牌:(在第1行第75列附近[SELECT sd from com.hp.amber.datamodel.entities.analysis.SnapshotDat

  • 问题内容: 我似乎在Hibernate中映射列表时遇到问题。在我们的项目中有一类用含有类与含有。 Hibernate 是否可以使用注释进行映射?我的意思是,因为它没有注释? 问候 问题答案: 用途: 资料来源: 7.2.3。基本类型和可嵌入对象的集合

  • 问题内容: 我在使用Hibernate创建子查询时遇到问题。不幸的是Subqueries类几乎完全没有文档,因此我完全不知道如何将以下SQL转换为Hibernate Criteria: 我希望以下内容能够“正常工作”: 但不幸的是,事实并非如此。因此,看来我实际上必须使用Subqueries类来创建Criteria。但是我无法通过Google找到一个合理的例子,因此这使我在这里提出了疑问。 问题答

  • 问题内容: 我的Java bean与我有很多关系。当我使用如下方式定义变量时: 我得到那个错误: 当我使用时,一切似乎都运行良好。 我想问的是,在使用多对多关系时,哪一个关系用于逻辑概念或(因为列表可能有重复项和集合,但是性能和其他问题又如何)? 问题答案: 从关系数据库的角度来看,这是一个集合。数据库不会保留顺序,并且使用a 是没有意义的,它们的顺序是不确定的(除非使用所谓的 索引集合 )。 使