【问题标题】:JPA - how to model this join with conditions?JPA - 如何根据条件对此连接进行建模?
【发布时间】:2016-06-30 06:37:51
【问题描述】:

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

数据结构如下:

  • 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 并查看哪个不为空?

【问题讨论】:

    标签: java hibernate jpa entity


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        鉴于表结构,您可以使用此处详述的 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{
        
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-22
          • 2011-07-07
          • 1970-01-01
          • 2013-04-22
          相关资源
          最近更新 更多