如何使用 JPA/休眠创建索引,并使用 MappEdSuperClass 中的字段以及具体实体中的字段

2022-09-01 19:50:20

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

@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.creationDateMyEntity.statusMyEntity.type

如果我添加到休眠状态,则会向从 继承的每个实体添加一个索引。@Index(name = "IDX_MYINDEX")MySuperClass.creationDatecreationDateMySuperClass

我试过了,但它不能用于索引。@AttributeOverride

有什么想法吗?


答案 1

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

@Table(indexes = { @Index(name = "IDX_MYIDX1", columnList = "id,name,surname") })

请注意,如文档所述

仅当表生成生效时,才使用这些方法。默认为无其他索引。

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

如果您不使用JPA 2.1,则可以只使用旧的注释(请注意,这已被弃用)。在某个属性中,您可以传递列名数组,无论它声明在哪个字段之上。Hibernate@IndexcolumnNames

@Index(name = "IDX_MYIDX1", columnNames = { "id", "name", "surname"})

答案 2

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

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


推荐