Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
改进JPA多态关联的设计_Jpa_Polymorphic Associations - Fatal编程技术网

改进JPA多态关联的设计

改进JPA多态关联的设计,jpa,polymorphic-associations,Jpa,Polymorphic Associations,我有以下JPA实体层次结构: 登录到应用程序后,用户在会话中有一个UserAccount实例;然后,根据与该用户帐户相关联的组织的具体类型(管理、业务或系列),会向用户显示不同的仪表板/屏幕,例如,如果用户是业务,则会显示该业务的仪表板 我对这种设计的担忧是,每次用户登录时,我都必须进行instanceof检查,以便知道要显示哪种类型的仪表板。我还可以通过在UserAccount中设置一个属性,例如organizationType(该属性将采用三个值中的一个),来避免instanceof检查,

我有以下JPA实体层次结构:

登录到应用程序后,用户在会话中有一个
UserAccount
实例;然后,根据与该
用户帐户相关联的组织的具体类型(
管理
业务
系列
),会向用户显示不同的仪表板/屏幕,例如,如果用户是
业务
,则会显示该业务的仪表板

我对这种设计的担忧是,每次用户登录时,我都必须进行
instanceof
检查,以便知道要显示哪种类型的仪表板。我还可以通过在
UserAccount
中设置一个属性,例如
organizationType
(该属性将采用三个值中的一个),来避免
instanceof
检查,但这样会有冗余信息


有没有办法改进我的设计?如果是这样的话,怎么办?

要贪婪,两样都要,不要冗余

根据继承策略,您可能已经拥有了
organizationType
信息,并且可以免费公开它

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class AbstractOrganization implements Serializable
{
    @Id
    protected Long id;

    @Column(name = "DTYPE", insertable = false, updatable = false)
    protected String organizationType;

    ...

}
这同样适用于加入的
策略

不要实现
setOrganizationType
方法


由于使用表模拟层次结构(除了
TABLE\u PER\u CLASS
策略)需要一个鉴别器,因此没有冗余,JPA提供商将为您处理此属性。

基本上是数据包的继承层次结构(即贫血症域模型)对我来说总是一个坏主意,这就是为什么我倾向于少用它们。三种组织类型的数据要求之间是否存在本质差异?如果不是,我会认真考虑将结构变平并使用<代码>组织类型< /代码>属性。如果存在本质差异,并且
组织
实体的客户机不知道他们正在与之交互的确切类别,那么无论如何,您必须在某个时候使用
instanceof
。或者,如果您确实想避免
instanceof
,您可以,使用访客模式,为具体的
组织
类型构建适当的
仪表板
(FTW,如果你问我的话)。如果有许多操作与
组织一起工作,但需要知道具体的类型,那么它们也可以以访问者的形式实现