2014-07-24 38 views
8

我有@MappedSupperClass(简化的示例)一起:如何创建具有索引JPA /休眠,并使用从mappedsupperclass字段与从混凝土实体字段

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

如果我添加@Index(name = "IDX_MYINDEX")MySuperClass.creationDate休眠增加了creationDate每一个实体的指数从MySuperClass继承。我试过@AttributeOverride,但它不适用于索引。

任何想法? TIA!

回答

18

如果您正在使用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"}) 
2

使用@index注释和使用参数“columnList”设置哪些栏目应该用来做索引。该列表应由逗号分隔的列名值列表组成。

重要:不要忘了列名属性(通过列注释)加入,使这个指数的所有属性,否则在启动你的容器中时,你会得到一个错误。