Hibernate @Index в поле @Enumerated не работает - PullRequest
3 голосов
/ 29 марта 2010

Я использую 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 ]

3 голосов
/ 30 марта 2010

Кажется, это работает так же, как у вас в вопросе. Я создал небольшое тестовое приложение , которое демонстрирует эту работу в автономном приложении.

Одна вещь, с которой я столкнулся, это то, что hibernate не будет пытаться создавать индексы во время операции обновления. Он создаст их с нуля hbm2ddl=create, но не во время обновления. Стандартный ответ команд hibernate на это, о котором сообщается как об ошибке: «hbm2ddl предназначен только для разработки, и поэтому индексы не требуются, и вы должны получить DBA.

Моя личная рекомендация, если это проблема, - начать использовать liquibase для управления созданием таких вещей, как индексы.

0 голосов
/ 30 марта 2010

Я провел тест со следующей сущностью:

@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, хотя. Я выполнил поиск существующих проблем (проект z- Аннотации Hibernate , Любой Тип проблемы в " index ") и не смог Не обнаружите ни одной недавней проблемы с последними версиями аннотаций Hibernate (это не означает, что проблем нет). Если вы создаете проблему, попробуйте предоставить простой исполняемый тестовый пример и журналы SchemaExport, это значительно повысит ваши шансы на ее устранение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...