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 评论