首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate:具有一个通用表的java子类实体的ID索引

Hibernate:具有一个通用表的java子类实体的ID索引
EN

Stack Overflow用户
提问于 2021-12-23 18:51:45
回答 1查看 50关注 0票数 0

我想问问。我有我的超一般实体:

代码语言:javascript
运行
复制
@Data
@NoArgsConstructor
@MappedSuperclass
public class SuperEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @CreationTimestamp
    @Column(name = "create_date")
    private OffsetDateTime createDate;

    @UpdateTimestamp
    @Column(name = "update_date")
    private OffsetDateTime updateDate;
}

以及从以前退出的一般实体:

代码语言:javascript
运行
复制
@Data
@NoArgsConstructor
@Entity
@Table(name = "base_entity",
    uniqueConstraints = {@UniqueConstraint(columnNames = {"first_name", "last_name"}, name = "un_base_entity")})
@Inheritance(strategy = InheritanceType.JOINED)
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@DiscriminatorColumn(name = "entity_type")
public class BaseEntity extends SuperEntity {

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;
}

然后,我有另外两个从BaseEntity扩展的实体:

代码语言:javascript
运行
复制
@Data
@NoArgsConstructor
@Entity
@Table(name = "animal")
@EqualsAndHashCode(callSuper = true)
@DiscriminatorValue("animal")
public class AnimalEntity extends BaseEntity {

    @Column(name = "owner_name")
    private String ownerName;
}
代码语言:javascript
运行
复制
@Data
@NoArgsConstructor
@Entity
@Table(name = "person")
@EqualsAndHashCode(callSuper = true)
@DiscriminatorValue("person")
public class PersonEntity extends BaseEntity {

    @Column(name = "country")
    private String country;
}

所以,我有三张桌子: base_entity,动物和人。它们中的每一个都有ID. ID在base_entity表中是引用。我应该为动物和人中的I创建索引吗?(我将在表中有很多数据)

UPD:为该实体添加了液化基脚本

代码语言:javascript
运行
复制
databaseChangeLog:
  - changeSet:
      id: 11-1
      changes:
        - createTable:
            columns:
              - column:
                  constraints:
                    nullable: false
                  name: entity_type
                  type: VARCHAR(31)
              - column:
                  autoIncrement: true
                  constraints:
                    nullable: false
                    primaryKey: true
                    primaryKeyName: base_entityPK
                  name: id
                  type: BIGINT
              - column:
                  name: first_name
                  type: VARCHAR(255)
              - column:
                  name: last_name
                  type: VARCHAR(255)
              - column:
                  constraints:
                    nullable: false
                  name: create_date
                  type: TIMESTAMP WITHOUT TIME ZONE
              - column:
                  constraints:
                    nullable: false
                  name: update_date
                  type: TIMESTAMP WITHOUT TIME ZONE
            tableName: base_entity
  - changeSet:
      id: 11-2
      changes:
        - createTable:
            columns:
              - column:
                  name: owner_name
                  type: VARCHAR(255)
               - column:
                   constraints:
                     nullable: false
                     primaryKey: true
                     primaryKeyName: animalPK
                   name: id
                   type: BIGINT
            tableName: animal
  - changeSet:
      id: 11-3
       changes:
         - createTable:
             columns:
               - column:
                   name: country
                   type: VARCHAR(255)
               - column:
                   constraints:
                     nullable: false
                     primaryKey: true
                     primaryKeyName: personPK
                   name: id
                   type: BIGINT
              tableName: person
  - changeSet:
      id: 11-4
      changes:
        - addUniqueConstraint:
            columnNames: first_name, last_name
            constraintName: un_base_entity
            tableName: base_entity
  - changeSet:
      id: 11-5
      changes:
        - addForeignKeyConstraint:
            baseColumnNames: id
            baseTableName: animal
            constraintName: FKgmpyb3wmodpc6y1qrp0jliykf
            deferrable: false
            initiallyDeferred: false
            referencedColumnNames: id
            referencedTableName: base_entity
            validate: true
  - changeSet:
      id: 11-6
      changes:
        - addForeignKeyConstraint:
            baseColumnNames: id
            baseTableName: person
            constraintName: FKgmpyb3wmodpc6y1qrp0jliyks
            deferrable: false
            initiallyDeferred: false
            referencedColumnNames: id
            referencedTableName: base_entity
            validate: true
EN

回答 1

Stack Overflow用户

发布于 2021-12-23 19:15:17

索引有助于加快查询速度,因此,如果您打算按其中一个列进行搜索,最好创建一个索引。ID是一个很好的候选索引:

在构建web时,apps/services

  • Those it通常是由外键引用的,并且在连接表时经常使用,通常所有的it都应该有唯一的索引,因为它是主键

但是索引占用空间并减慢DML (insert/delete/update语句),所以不要盲目地添加它们。您应该了解应用程序(Hibernate)生成并只添加实际使用的索引的查询。

关系数据库还提供命令来分析查询以及它们将如何执行--这些命令被称为查询计划。如果您看到有些查询比较慢,则可以使用查询计划查找性能问题,并确定要添加哪些索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70466293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档