我相信这是一个常见的问题/问题,但一直无法找到一个干净简洁的答案。
问题所在
如何映射看似具有继承关系的实体:
Company
Supplier
Manufacturer
Customer
但是,供应商可以是制造商。
或
Person
Doctor
Patient
Employee
患者可以是医生或员工。
建议:使用角色
在NHibernate论坛的讨论中,人们的反应通常是多重继承。
http://forum.hibernate.org/viewtopic.php?t=959076
他们建议的解决方案是使用组合或使用"角色"。 但是,我找不到任何关于如何做到这一点的例子或解释。
"偏爱作曲而不是继承。" 记住那个小好东西 .class?在这种情况下,我必须 同意您正在尝试多个 继承 -- 在 C# 或 爪哇(还)。我个人会 鼓励你思考 重塑,让你有一个人 对象和一个人有一对多 角色集合。
您可能需要考虑使用角色。因此,角色将具有一组人员。或者一个人将有一组角色或两者。这可能意味着存在将人员映射到角色的关联类。
定义一个 Person 类,其中包含人员共有的所有属性。然后定义一个角色超类和 DoctorRole、PatientRole 和 EmployeeRole 子类(假设每个角色都有不同的属性)。
Person 类可以定义角色集合,角色类可以定义人员集合。或者,创建一个关联类可能更容易,我们称之为PeopleRole。
本页介绍如何执行映射,以便 PeopleRole 成为复合元素。查看订单/产品/订单项示例。您的人就像订单,人员角色就像行项目,角色就像产品。
在我看来,这更多的是关于如何很好地建模域的问题,而不是NHibernate映射问题。
一旦你整理了你的领域建模,我想你会发现NHibernate映射相对容易地失败。
要了解角色建模的想法,一个地方是寻找"颜色建模" - Jeff de Luca有一些资源,尽管这个想法起源于Peter Coad。
基本思想是将参与者的身份与他们在活动中扮演的角色分开。
例如,您可能有一个 Person 对象,用于捕获特定人员的标识。
然后,一个完全独立的对象"学生",用于捕获附加信息以记录某人作为学生的注册情况。学生的每个实例都将具有对注册人员的引用。一个人可能与许多"学生"记录相关,每个不同的注册都有一个。
同时,您可以有一个独特的"导师"对象,当有人被雇用在一对一的情况下教学生时,该对象记录就业细节。Tutor 对象捕获有关如何将某人用作导师的其他详细信息。
这种结构为您提供了极大的灵活性 - 一个人(Joe Bloggs)可能只是一名学生,另一个人(Jane Doe)可能只是一名导师,第三个人(Chuck Norris)可能两者兼而有之。
此外,引入另一个角色(讲师、标记员、管理员)变得更加容易,因为添加不需要更改现有对象。
我遇到了更多您可能会发现相关的评论:
在裸体博客上的一篇博客文章中,概述了几种不同的方法,讨论了每种方法的优缺点。
- 使用"任意"关联映射
- 将角色建模为类