Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Hibernate处理不同的用户类型_Java_Hibernate_Database Design - Fatal编程技术网

Java 使用Hibernate处理不同的用户类型

Java 使用Hibernate处理不同的用户类型,java,hibernate,database-design,Java,Hibernate,Database Design,我正在用Spring框架+Hibernate启动一个web应用程序项目。我想在应用程序中为两种不同类型的用户建模:医生和患者。他们有一些共同的属性,如姓名、电子邮件、电话号码等,但医生有更具体的属性,如学院号码、专业、学习等 这是一个简化的E-R模型(Hibernate方法),没有属性 如您所见,关系将变为1对1,但其中一个始终为空。我也考虑过使用继承,但我从未在Hibernate中使用过它,所以我不知道哪种方法是最好的,为什么。哪种方法最简单有效 谢谢 继承方法只是在持久性上下文中在两个托管

我正在用Spring框架+Hibernate启动一个web应用程序项目。我想在应用程序中为两种不同类型的用户建模:医生患者。他们有一些共同的属性,如姓名、电子邮件、电话号码等,但医生有更具体的属性,如学院号码、专业、学习等

这是一个简化的E-R模型(Hibernate方法),没有属性

如您所见,关系将变为1对1,但其中一个始终为空。我也考虑过使用继承,但我从未在Hibernate中使用过它,所以我不知道哪种方法是最好的,为什么。哪种方法最简单有效


谢谢

继承方法只是在持久性上下文中在两个托管类型之间共享公共属性的一种方法。不要忘记,
@MappedSuperclass
在没有将这两种数据类型在任何层次意义上耦合在一起的情况下做了完全相同的事情

从一个领域的角度来看,一个要考虑的是<代码>医生<代码>是否是<代码>患者< /代码>,如果是的话,从API的角度来看,这意味着什么?

可以打电话给
#获取患者诊断(患者)
并将
医生
传给它吗?从代码的角度来看,它是编译的,并且是逻辑的,因为您选择了继承,但从域的角度来看,这是没有意义的

这是我经常主张将域模型与持久性模型分离的一个原因。从数据存储的数据模型角度来看,通常有一些设计决策是完全有意义的,但是这些决策在更高的抽象级别引入了技术债务


如果是我将实体重用为域模型,我会选择
@MappedSuperclass
,除非您有另一个令人信服的理由在这种情况下使用继承。

谢谢您的回答@Naros,我不知道
@MappedSuperclass
注释,但我认为这不是我需要的,因为我使用的是一个用户帐户,该帐户将存储在每个用户的会话中,所以我希望使用用户帐户id检索
患者
医生
,所以我认为这个解决方案不太合适,对吗?您的图表告诉我,
帐户
由两个关系组成,这两个关系都是可选的,
医生
患者
。除此之外,如何解释读取这两个属性和分支是应用程序关心的问题,不一定规定持久层的继承要求,除非您希望在表中以这种方式对数据建模。谢谢@Naros,我理解。那么,哪种方法更好:1-可选1对1关系,并检查
帐户
是否具有非空
患者
医生
或2-继承(使用相应的db表)每次我需要时,都可以通过
账户
标识符找到
患者
医生
?坦率地说,这是一个主观问题,因为在某个时候,您可能会有一些代码需要根据它是
医生
还是
患者
进行分支。使用显式映射,这将成为一个空检查。通过继承,这将成为检查的实例。我仍然把我对API的关注放回到我的观点上,在API中,您明确地期望一个
患者
,但在这些情况下,使用继承允许传递一个
医生
。如果是我,我会使用显式映射和If-checks。哦,是的,这是真的,你之前提到过,我同意你对API的关注,所以是的,我将使用显式映射。非常感谢你的观点!