拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 在JPA中定义索引

在JPA中定义索引

白鹭 - 2021-11-24 503 0 0

1.简介

在本教程中,我们将讨论使用JPA的@Index注释定义索引。通过示例,我们将学习如何使用JPA和Hibernate定义第一个索引。之后,我们将修改定义,以显示其他定制索引的方法。

2. @Index注释

让我们从快速回顾开始。数据库索引是一种数据结构,它以增加的写入和存储空间为代价,提高了对表进行数据检索操作的速度。通常,它是从单个表中选择的数据列的副本。我们应该创建索引来提高持久层的性能。

@Index从代码中定义索引来实现这一点。该注释由模式生成过程解释,并自动创建工件。请注意,没有必要为我们的实体指定任何索引。

现在,让我们看一下定义。

2.1。 javax.persistence.Index

javax.persistence.Index在JPA 2.1规范中添加了对索引的支持。该注释使我们可以为表定义索引并相应地对其进行自定义:

@Target({})

 @Retention(RUNTIME)

 public @interface Index {

 String name() default "";

 String columnList();

 boolean unique() default false;

 }

如我们所见,只有columnList属性是必需的,我们必须对其进行定义。我们将在后面的示例中对每个参数进行更好地研究。

2.2。 JPA与Hibernate

我们知道JPA只是一个规范。为了正常工作,我们还需要指定一个持久性提供程序。默认情况下,Hibernate Framework是Spring交付的JPA的实现。有关它的更多信息,您可以在这里阅读。

我们应该记住,索引支持已经很晚才添加到JPA中。在此之前,许多ORM框架通过引入自己的自定义实现来支持索引,而自定义实现的工作方式可能有所不同。 Hibernate Framework也做到了这一点,并引入了org.hibernate.annotations.Index注释。在使用该框架时,我们必须注意自JPA 2.1规范支持以来已弃用该框架,我们应该使用JPA的框架。

现在,当我们具有一定的技术背景时,我们可以看一下示例并在JPA中定义我们的第一个索引。

3.定义@Index

在本节中,我们将实现索引。稍后,我们将尝试对其进行修改,以提供不同的自定义可能性。

在开始之前,我们需要正确地初始化我们的项目并定义一个模型。

让我们实现一个Student实体:

@Entity

 @Table

 public class Student implements Serializable {

 @Id

 @GeneratedValue

 private Long id;

 private String firstName;

 private String lastName;



 // getters, setters

 }

建立模型后,让我们实现第一个索引。我们要做的就是添加一个@Index注释。我们做的是,在@Table下注释indexes属性。让我们记住指定列的名称:

@Table(indexes = @Index(columnList = "firstName"))

firstName列声明了第一个索引。当我们执行模式创建过程时,我们可以对其进行验证:

[main] DEBUG org.hibernate.SQL -

 create index IDX2gdkcjo83j0c2svhvceabnnoh on Student (firstName)

现在,该修改我们的声明以显示其他功能了。

3.1。 @Index名称

如我们所见,索引必须有一个名称。默认情况下,如果未指定,则为提供程序生成的值。当我们想要一个自定义标签时,我们只需添加name属性:

@Index(name = "fn_index", columnList = "firstName")

此变体使用用户定义的名称创建索引:

[main] DEBUG org.hibernate.SQL -

 create index fn_index on Student (firstName)

此外,我们可以通过在指定模式的名字创建了我们在不同的架构指数name

@Index(name = "schema2.fn_index", columnList = "firstName")

3.2。多@Index

现在,让我们仔细看看columnList语法:

column ::= index_column [,index_column]*

 index_column ::= column_name [ASC | DESC]

众所周知,我们可以指定要包含在索引中的列名称。当然,我们可以为单个索引指定多个列。我们通过用逗号分隔名称来做到这一点:

@Index(name = "mulitIndex1", columnList = "firstName, lastName")



 @Index(name = "mulitIndex2", columnList = "lastName, firstName")
[main] DEBUG org.hibernate.SQL -

 create index mulitIndex1 on Student (firstName, lastName)



 [main] DEBUG org.hibernate.SQL -

 create index mulitIndex2 on Student (lastName, firstName)

请注意,持久性提供程序必须遵守列的指定顺序。在我们的示例中,即使索引指定了相同的列集,索引也略有不同。

3.3。 @Index顺序

当我们回顾了上一节中的语法时,我们还可以column_name ASC (升序)和DESC (降序)值。我们使用它来设置索引列中值的排序顺序:

@Index(name = "mulitSortIndex", columnList = "firstName, lastName DESC")
[main] DEBUG org.hibernate.SQL -

 create index mulitSortIndex on Student (firstName, lastName desc)

我们可以指定每列的顺序。如果我们不这样做,则假定升序。

3.4。 @Index唯一性

最后一个可选参数是unique属性,该属性定义索引是否唯一。唯一索引可确保索引字段不会存储重复值。默认情况下,它为false 。如果要更改它,可以声明:

@Index(name = "uniqueIndex", columnList = "firstName", unique = true)
[main] DEBUG org.hibernate.SQL -

 alter table Student add constraint uniqueIndex unique (firstName)

当我们以这种方式创建索引时,我们在列上添加了唯一性约束,类似地,作为@Column批注上unique属性也是如此。 @Index @Column具有优势,因为它可以声明多列唯一约束:

@Index(name = "uniqueMulitIndex", columnList = "firstName, lastName", unique = true)

3.5。单个实体上有多个@Index

到目前为止,我们已经实现了索引的不同变体。当然,我们不仅限于在实体上声明单个索引。让我们收集声明并一次指定每个索引。 @Index注释并用逗号分隔来做到这一点:

@Entity

 @Table(indexes = {

 @Index(columnList = "firstName"),

 @Index(name = "fn_index", columnList = "firstName"),

 @Index(name = "mulitIndex1", columnList = "firstName, lastName"),

 @Index(name = "mulitIndex2", columnList = "lastName, firstName"),

 @Index(name = "mulitSortIndex", columnList = "firstName, lastName DESC"),

 @Index(name = "uniqueIndex", columnList = "firstName", unique = true),

 @Index(name = "uniqueMulitIndex", columnList = "firstName, lastName", unique = true)

 })

 public class Student implements Serializable

而且,我们还可以为同一组列创建多个索引。

3.6。首要的关键

当我们谈论索引时,我们必须在主键上停一会儿。 EntityManager管理的每个实体都必须指定一个映射到主键的标识符。

通常,主键是特定类型的唯一索引。值得补充的是,我们不必以前面介绍的方式声明此键的定义。一切由@Id注释自动完成。

3.7。非实体@Index

在学习了不同的实现索引的方法之后,我们应该提到@Table不是唯一指定索引的地方。以同样的方式,我们可以在申报指标@SecondaryTable ,@CollectionTable, @JoinTable@TableGenerator注解。这些示例不在本文讨论之列。有关更多详细信息,请检查javax.persistence JavaDoc

4。结论

在本文中,我们讨论了使用JPA声明索引。我们首先回顾了有关它们的常识。后来,我们实现了第一个索引,并通过示例学习了如何通过更改名称,包括的列,顺序和唯一性来对其进行自定义。最后,我们讨论了主键以及可以声明它们的其他方式和位置。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *