@Enumerated字段上的Hibernate @Index不起作用

时间:2010-03-29 11:07:39

标签: java hibernate orm indexing

我正在使用Hibernate与我的数据库通信。我有一个枚举字段,它将用于慢查询。所以我想索引它。我在这个领域写了以下注释:

@Column(name="RIGHT_TYPE", unique=false, nullable=false, length=10)
@Enumerated(EnumType.STRING)
@Index(name = "ABC_INDEX")
protected RightType rightType;

但是,我没有在该字段上看到任何索引。

我正在使用org.hibernate.dialect.Oracle9Dialect。 (修剪下来的)ddl是:

create table DOCUMENTS (documentID varchar2(255 char) not null, owner_principalId varchar2(255 char), primary key (documentID))
create table DOC_RIGHTS (document raw(255) not null, primary key (document))
create table PRINCIPAL (TYPE varchar2(31 char) not null, principalId varchar2(255 char) not null, displayName varchar2(255 char), primary key (principalId))
create table PRINCIPAL_RIGHTS (id varchar2(255 char) not null, PRINCIPAL_ID varchar2(255 char) unique, DOCUMENT_RIGHT_ID raw(255) unique, primary key (id))
create table RIGHTS (TYPE varchar2(31 char) not null, id number(19,0) not null, RIGHT_TYPE varchar2(10 char) not null, PRINCIPAL_RIGHT_ID varchar2(255 char) unique, primary key (id))
create table ROLE_MAP (PRINCIPAL_ID varchar2(255 char) not null, ROLE_ID varchar2(255 char) not null)
alter table DOCUMENTS add constraint FKDC2BB35E362547 foreign key (owner_principalId) references PRINCIPAL
create index PRINCIPAL_INDEX on PRINCIPAL_RIGHTS (PRINCIPAL_ID)
alter table PRINCIPAL_RIGHTS add constraint FKB32239ADFB30571B foreign key (PRINCIPAL_ID) references PRINCIPAL
alter table PRINCIPAL_RIGHTS add constraint FKB32239ADE1F0C813 foreign key (DOCUMENT_RIGHT_ID) references DOC_RIGHTS
create index RIGHT_TYPE_INDEX on RIGHTS (RIGHT_TYPE)
alter table RIGHTS add constraint FKF34FBA9CA09D6215 foreign key (PRINCIPAL_RIGHT_ID) references PRINCIPAL_RIGHTS
alter table ROLE_MAP add constraint FKA413CD78FB30571B foreign key (PRINCIPAL_ID) references PRINCIPAL
alter table ROLE_MAP add constraint FKA413CD7883A04939 foreign key (ROLE_ID) references PRINCIPAL
create sequence RIGHTS_SEQUENCE

但如果我愿意,我可以手动创建一个。这是为什么?有没有办法强制Hibernate实现它?

2 个答案:

答案 0 :(得分:3)

这似乎与您提出的问题一样有效。我创建了一个小test app来演示这个在独立应用程序中工作。

我要发生的一件事是,hibernate不会在更新操作期间尝试创建索引。它将从头开始hbm2ddl=create创建它们,但不会在更新期间创建它们。 hibernate团队的标准响应被报告为一个错误是'hbm2ddl仅用于开发,因此不需要索引,你应该得到一个DBA。

如果出现问题,我的个人推荐是开始使用liquibase来管理创建索引等内容。

答案 1 :(得分:0)

我使用以下实体进行了测试:

@Entity
public class EntityWithIndices {
    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "GENDER_TYPE", unique = false, nullable = false, length = 10)
    @Enumerated(EnumType.STRING)
    @Index(name = "ABC_INDEX")
    protected GenderType genderType;

    // getter and setters
} 

使用以下枚举:

public enum GenderType {
    FEMALE("0"), MALE("1");

    private final String genderCode;

    public String getCode() {
        return this.genderCode;
    }

    private GenderType(String code) {
        this.genderCode = code;
    }
}

使用Hibernate Annotations 3.4.0.GA,MySQL 5.1作为数据库,生成索引。我不能尝试使用Oracle。我在“ index ”上做了search for existing issues(项目 z- Hibernate Annotations 任何问题类型),但找不到最近版本的Hibernate注释的任何最新问题(这并不意味着没有问题)。如果您创建了一个问题,请尝试提供一个简单的可运行测试用例和SchemaExport日志,这将大大增加您修复它的机会。