如何使用JPA/hibernate创建索引,并使用MappedSuperClass中的字段以及来自具体实体的字段

t77*_*777 19 java hibernate jpa

我有@MappedSuperClass(简化的例子):

@MappedSuperclass
public abstract class MySuperClass {

    @Id
    @GeneratedValue
    private long id;

    @Column(nullable = false)
    private Date creationDate;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

和具体的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;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

现在我需要包括列的索引MySuperClass.creationDate,MyEntity.statusMyEntity.type.

如果我添加@Index(name = "IDX_MYINDEX")MySuperClass.creationDatehibernate,则为creationDate每个继承的Entity 添加一个索引MySuperClass.

我试过@AttributeOverride但它不能用于索引.

有任何想法吗?TIA!

Mac*_*ski 55

如果您正在使用,JPA 2.1则可以使用类注释@Table及其属性索引

@Table(indexes = { @Index(name = "IDX_MYIDX1", columnList = "id,name,surname") })
Run Code Online (Sandbox Code Playgroud)

请注意,正如文档所述

这些仅在表生成有效时使用.默认为无其他索引.

columnlist,如上所示,接受列名列表作为逗号分隔列表.

如果您不使用JPA 2.1,则可以使用旧Hibernate@Index注释(请注意,这已被弃用).有一个属性columnNames,您可以传递列名称数组,无论它在哪个字段上声明.

@Index(name = "IDX_MYIDX1", columnNames = { "id", "name", "surname"})
Run Code Online (Sandbox Code Playgroud)


小智 5

使用@Index 注释并使用参数“columnList”来设置应该使用哪些列来制作索引。该列表应由逗号分隔的列名值列表组成。

重要提示:不要忘记将列名属性(通过 Column 注释)添加到创建此索引的所有属性中,否则在启动容器时会出现错误。