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

时间:2014-07-24 20:32:37

标签: java hibernate jpa

我有@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.creationDate,则hibernate会为从creationDate继承的每个实体添加MySuperClass的索引。

我尝试了@AttributeOverride,但它无法用于索引。

有什么想法吗? TIA!

4 个答案:

答案 0 :(得分:47)

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

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

请注意,正如文档所述

  

仅在表生成有效时使用。默认为否   附加索引。

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

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

@Table(name = "table_name",indexes = [Index(name = "name_of_index", columnList = "liste of fields separated by ',' ")])

答案 3 :(得分:0)

请确保您在@Column的name属性中指定的列表列名称,而不是字段名称。

还启用ddl-auto更新将创建所有索引。

spring.jpa.hibernate.ddl-auto=update

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "ANSWER_OPTION", indexes = {@Index(name="SEC_INDEX",columnList = "ID,SEQUENCE,QUESTION_ID,OPTION_TITLE")})
public class AnswerOptionEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(name = "SEQUENCE")
private Long sequence;

@Column(name = "OPTION_TITLE")
private String optionTitle;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "QUESTION_ID", nullable = false)
@JsonIgnore
private QuestionEntity questionEntity;

@OneToMany(mappedBy = "answerOptionEntity", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JsonIgnore
private List<ResultEntity> resultEntityList = new ArrayList<>();

}