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

jpa - 改进JPA多态关联的设计-LMLPHP

登录到应用程序后,用户在会话中具有UserAccount的实例。然后根据与该UserAccount关联的组织的具体类型(AdminBusinessFamily),向用户显示不同的仪表板/屏幕,例如如果用户是Business,则显示该企业的仪表板。

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

有没有办法改善我的设计?如果可以,怎么办?

最佳答案

贪婪地获取两者,不要多余。

根据继承策略,您可能已经具有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;

    ...

}


JOINED策略也是如此。

不要实现setOrganizationType方法。

由于使用表模拟层次结构需要区分符(TABLE_PER_CLASS策略除外),因此没有冗余,并且JPA提供程序将为您处理此属性。

08-05 15:59