如何使用JPA / hibernate创建索引,并使用mappedsupperclass中的字段和来自具体实体的字段
我有@MappedSupperClass
(简化示例):
@MappedSuperclass public abstract class MySuperClass { @Id @GeneratedValue private long id; @Column(nullable = false) private Date creationDate; // ... }
和一个具体Entity
(简化示例):
@Entity public class MyEntity extends MySuperClass { @Index(name = "IDX_MYINDEX") @Column(nullable = false) @Enumerated(EnumType.STRING) private MyType type; @Index(name = "IDX_MYINDEX") @Column(nullable = false) @Enumerated(EnumType.STRING) private MyResult status; // ... }
现在我需要一个索引,包括MySuperClass.creationDate
, MyEntity.status
和MyEntity.type
列。
如果我将@Index(name = "IDX_MYINDEX")
添加到MySuperClass.creationDate
hibernate会为从MySuperClass
inheritance的每个Entity添加一个creationDate
索引。
我试过@AttributeOverride
但它不能用于索引。
有任何想法吗? TIA!
如果您使用的是JPA 2.1
则可以使用类注释@Table
及其属性索引
@Table(indexes = { @Index(name = "IDX_MYIDX1", columnList = "id,name,surname") })
请注意,正如文件所述
这些仅在表生成有效时使用。 默认为无其他索引。
如上所示, columnlist
接受列名列表作为逗号分隔列表。
如果你不使用JPA 2.1,你可以使用旧的Hibernate
的@Index
注释(注意这已被弃用)。 有一个属性columnNames
,您可以在其中传递列名称数组,无论它在哪个字段上声明。
@Index(name = "IDX_MYIDX1", columnNames = { "id", "name", "surname"})
使用@Index注释并使用参数“columnList”来设置应该使用哪些列来创建索引。 该列表应由逗号分隔的列名值列表组成。
重要提示:不要忘记将列名属性(通过列注释)添加到创建此索引的所有属性,否则在启动容器时会出错。