Java 如何使用JPA/hibernate创建索引,并将MappedSuperClass中的字段与具体实体中的字段一起使用
我有Java 如何使用JPA/hibernate创建索引,并将MappedSuperClass中的字段与具体实体中的字段一起使用,java,hibernate,jpa,Java,Hibernate,Jpa,我有@MappedSuperClass(简化示例): 以及具体的实体(简化示例): 现在我需要一个索引,包括MySuperClass.creationDate、MyEntity.status和MyEntity.type列 如果我将@Index(name=“IDX_MYINDEX”)添加到MySuperClass.creationDatehibernate将creationDate的索引添加到从MySuperClass继承的每个实体 我尝试了@AttributeOverride,但它不能用于索引
@MappedSuperClass
(简化示例):
以及具体的实体
(简化示例):
现在我需要一个索引,包括MySuperClass.creationDate
、MyEntity.status
和MyEntity.type
列
如果我将@Index(name=“IDX_MYINDEX”)
添加到MySuperClass.creationDate
hibernate将creationDate
的索引添加到从MySuperClass
继承的每个实体
我尝试了@AttributeOverride
,但它不能用于索引
有什么想法吗?如果您使用的是
JPA2.1
,那么您可以使用带有属性索引的类注释@Table
@Table(indexes = { @Index(name = "IDX_MYIDX1", columnList = "id,name,surname") })
请注意,如文档所示
仅当表格生成生效时才使用这些选项。默认为no
附加索引
columnlist
,如上所示,接受列名列表作为逗号分隔的列表
如果您不使用JPA2.1,您可以只使用旧的Hibernate
s@Index
注释(注意,此注释已被弃用)。这里有一个属性columnNames
,您可以在其中传递列名数组,而不管它声明在哪个字段之上
@Index(name = "IDX_MYIDX1", columnNames = { "id", "name", "surname"})
使用@Index注释并使用参数“columnList”设置应使用哪些列来创建索引。该列表应由以逗号分隔的列名值列表组成
重要提示:不要忘记将列名属性(通过列注释)添加到构成此索引的所有属性中,否则在启动容器时会出现错误。请确保列出在@column的name属性中给定的列名,而不是字段名
@Table(name = "table_name",indexes = [Index(name = "name_of_index", columnList = "liste of fields separated by ',' ")])
同时启用ddl自动更新将创建所有索引
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<>();
@Getter
@塞特
@建筑商
@AllArgsConstructor
@诺尔格构装师
@实体
@表(name=“ANSWER\u OPTION”,Index={@Index(name=“SEC\u Index”,columnList=“ID,SEQUENCE,QUESTION\u ID,OPTION\u TITLE”))
公共类回答选项{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@列(name=“SEQUENCE”)
私有长序列;
@列(name=“OPTION\u TITLE”)
私有字符串optionTitle;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“QUESTION\u ID”,null=false)
@杰索尼奥雷
私人问题实体问题实体;
@OneToMany(mappedBy=“answerOptionEntity”,fetch=FetchType.LAZY,cascade=CascadeType.ALL,orphan=true)
@杰索尼奥雷
私有列表resultEntityList=新的ArrayList();
}我曾尝试在具有Column name属性的字段上添加列注释,但在启动容器时仍然出现错误,即键值太长。你能帮我吗help@emphywork我认为您需要缩短索引中使用的字段的长度,这可以通过
@列(length=…)
注释指定。
@Table(name = "table_name",indexes = [Index(name = "name_of_index", columnList = "liste of fields separated by ',' ")])
@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<>();