我相信这是一个常见的问题/问题,但未能找到一个干净简洁的答案.
问题
如何映射看似具有继承关系的实体:
Company
Supplier
Manufacturer
Customer
Run Code Online (Sandbox Code Playgroud)
但是,供应商可以是制造商.
要么
Person
Doctor
Patient
Employee
Run Code Online (Sandbox Code Playgroud)
患者可以是医生,也可以是员工.
建议:使用角色
在NHibernate论坛的讨论中,响应通常是多重继承.
http://forum.hibernate.org/viewtopic.php?t=959076
他们建议的解决方案是使用组合或使用"角色".但是,我找不到任何关于如何做到这一点的例子或解释.
"赞成合成而非继承." 还记得班上的小礼物吗?在这种情况下,我必须同意你正在尝试多重继承 - 在C#或Java(尚未)中是不可能的.我个人会鼓励您考虑重新建模,因此您拥有一个Person对象,而一个人拥有一对多的角色集合.
您可能要考虑使用角色。因此一个角色将有一组人员。或者一个人将拥有一组角色或两者兼而有之。这可能意味着存在一个将人员映射到角色的 Association 类。
定义一个具有人们共有的所有属性的 Person 类。然后定义一个Role超类和DoctorRole、PatientRole和EmployeeRole子类(假设每个角色有不同的属性)。
Person 类可以定义角色集合,Role 类可以定义人员集合。或者创建一个 Association 类可能更容易,我们将其称为 PeopleRole。
本页说明如何进行映射以使 PeopleRole 成为复合元素。查看订单/产品/订单项示例。您的 Person 就像订单,PeopleRole 就像 LineItem,Role 就像产品。