我有@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.creationDate
,MyEntity.status
和MyEntity.type
列的索引。
如果我将@Index(name = "IDX_MYINDEX")
添加到MySuperClass.creationDate
,则hibernate会为从creationDate
继承的每个实体添加MySuperClass
的索引。
我尝试了@AttributeOverride
,但它无法用于索引。
有什么想法吗? TIA!
答案 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<>();
}