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列可能为空,或者可能指向Employee表的另一行。业务规则要求员工了解他/她的所有报告者以及他/她的经理。业务规则还允许行具有 null managerId(组织的 CEO 没有经理)。
我们如何在 Hibernate 中映射这种关系,标准的多对一关系在这里不起作用?特别是,如果我不仅想将我的实体实现为相应的“Employee”实体类,而是多个类,例如“Manager”,“Assistant Manager”,“Engineer”等,每个类都继承自“Employee”超级实体类,某些实体的属性实际上并不适用于所有人,例如“经理”获得Perks,其他实体则没有(相应的表列当然会接受null)。
示例代码将不胜感激(我打算使用 Hibernate 3 注释)。
I hardly see any pointer on the following problem related to Hibernate. This pertains to implementing inheritance using a single database table with a parent-child
relationship to itself. For example:
CREATE TABLE Employee (
empId BIGINT NOT NULL AUTO_INCREMENT,
empName VARCHAR(100) NOT NULL,
managerId BIGINT,
CONSTRAINT pk_employee PRIMARY KEY (empId)
)
Here, the managerId column may be null, or may point to another row of the Employee table. Business rule requires the Employee to know about all his reportees and for him to know about his/her manager. The business rules also allow rows to have null managerId (the CEO of the organisation doesn't have a manager).
How do we map this relationship in Hibernate, standard many-to-one relationship doesn't work here? Especially, if I want to implement my Entities not only as a corresponding "Employee" Entity class, but rather multiple classes, such as "Manager", "Assistant Manager", "Engineer" etc, each inheriting from "Employee" super entity class, some entity having attributes that don't actually apply to all, for example "Manager" gets Perks, others don't (the corresponding table column would accept null of course).
Example code would be appreciated (I intend to use Hibernate 3 annotations).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您在这里表达了两个概念:
要实现 1.,您需要使用 Hibernate 的 单表每个类层次结构策略:
要实现2.,您需要在
Employee
上添加两个自引用关联:Employee
)生成的
Employee
可能如下所示:这将产生下表:
You are expressing two concepts here:
To implement 1., you'll need to use Hibernate's single table per class hierarchy strategy:
To implement 2., you'll need to add two self-referencing associations on
Employee
:Employee
)The resulting
Employee
may looks like this:And this would result in the following tables:
非常感谢你们。我创建了我的员工实体,如下所示:
然后我添加了其他没有主体但只有鉴别器列值的实体类,例如 Manager、CEO 和 AsstManager。我选择让 Hibernate 为我创建表。以下是主程序:
代码运行良好,Hibernate 自己创建了一个列“MANAGER_EMPLOYEE_ID”,用于存储 FK。我指定了 JoinColumn 名称以使其成为“MANAGER_ID”。 Hibernate 还创建了一个表 EMPLOYEE_EMPLOYED,但数据并未保留在那里。
方法 getReportees() 方法返回 null,而 getManager() 工作正常,如预期的那样。
Thanks a ton guys. I created my Employee Entity as follows:
I then added other Entity classes with no body but just Discriminator columns values, such as Manager, CEO and AsstManager. I chose to let Hibernate create the table for me. Following is the main program:
The code runs fine, Hibernate was creating a column "MANAGER_EMPLOYEE_ID" on its own where it stores the FK. I specified the JoinColumn name to make it "MANAGER_ID". Hibernate also creates a table EMPLOYEE_EMPLOYED, however the data is not being persisted there.
Method getReportees() method returns a null, while getManager() works fine, as expected.
我不确定您是否真的想要,但我认为您想要每个类层次结构有一个表
在这种情况下,每个实体按 DISCRIMINATOR_COLUMN 排序,如下所示
,它的子级是为了
测试,让我们执行以下操作
但是,您的模型不是继承(由于多个实体共享同一张表,您可以看到很多 NULL 列 - 当使用 InheritanceType.SINGLE_TABLE 策略时),您的模型将是更好如下
请随意选择满足您需求的最佳方法。
问候,
I am not sure about you really want, but i think you want a Table per class hierarchy
In that case, each Entity is sorted by a DISCRIMINATOR_COLUMN as follows
And its Children is mapped according to
In order to test, let's do the following
But, instead of inheritance (which you can see a lot of NULL column due to more than one Entity share the same table - when using InheritanceType.SINGLE_TABLE strategy), your model would be better as follows
Feel free to choice the best approach that fulfill your needs.
regards,