JPA - 如何使用条件对此连接建模?

时间:2016-06-30 06:37:52

标签: java hibernate jpa entity

我试图找到答案,但不幸的是,没有运气。

数据结构如下所示:

  • TABLE_X - 包含userId,还包含userType,告知这是外部用户还是内部用户
  • INTERNAL_USERS - 包含关键userId
  • EXTERNAL_USERS - 还包含关键userId

TABLE_X.userId是INTERNAL_USERS.userId或EXTERNAL_USERS.userId。

现在,我想将一个实体映射到TABLE_X之外,并将用户对象映射到正确的实体,INTERNAL_USERS或EXTERNAL_USERS。 我该怎么做?

我应该创建两个字段并将一个字段映射到INTERNAL_USERS和一个两个EXTERNAL_USERS,只看哪一个不为空?

3 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,您需要做的是使用TABLE_X类的字段复制TABLE_X列的结构,并将其添加到INTERNAL_USERS.userID的一个字段和EXTERNAL_USERS.userID的一个字段

但是如果你在TABLE_X.userType上存储,如果用户是内部的或外部的,我认为你能做的最好的事情就是不创建任何其他表,因为你只需要在第一个表上获得所需的信息(TABLE_X) 。如果你想知道所有内部用户,只需要做一个SQL并选择TABLE_X中的所有值,其中userType ="内部"

答案 1 :(得分:0)

使用Hibernate继承。查看每个类继承模式的表。这里有TABLE_X中的INTERNAL_USERS或EXTERNAL_USERS数据,userType作为鉴别器列。 http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1191

答案 2 :(得分:0)

根据表结构,您可以使用JPA继承,详见此处:

https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Example_joined_inheritance_annotations

在Hibernate中,您可以按如下方式对这种关系进行建模。查询用户时,您可以依赖Hibernate返回正确类型的实例。

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class User{

    @Id
    private Long userId;
}

@Entity
public class InternalUser extends User{


}

@Entity
public class ExternalUser extends User{


}

正如链接到的文章所述,Hibernate在使用联接继承时不需要指定鉴别器列。但是,它确实支持鉴别器列(如果有的话)。由于您的架构中有一个可用 - userType - 然后您可以根据需要明确指定它。我想这会在生成的SQL方面产生一些性能优势:

带有可选鉴别器列的映射:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="userType")
public class User{

    @Id
    private Long userId;
}

@Entity
@DiscriminatorValue("INT")
public class InternalUser extends User{


}

@Entity
@DiscriminatorValue("EXT")
public class ExternalUser extends User{


}