Как определить индекс по нескольким столбцам в спящем объекте? - PullRequest
7 голосов
/ 02 февраля 2010

Утро.

Мне нужно добавить индексацию в спящем объекте. Как я знаю, можно использовать аннотацию @Index для указания индекса для отдельного столбца, но мне нужен индекс для нескольких полей объекта.

Я гуглил и нашел аннотацию jboss @Table, которая позволяет это делать (по спецификации). Но (я не знаю почему) эта функциональность не работает. Может быть, версия jboss ниже необходимой, или, может быть, я не понимаю, как использовать эту аннотацию, но ... сложный индекс не создается.

Почему индекс не может быть создан?

jboss версия 4.2.3.GA

Пример сущности:

package somepackage;
import org.hibernate.annotations.Index;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@org.hibernate.annotations.Table(appliesTo = House.TABLE_NAME,
    indexes = {
            @Index(name = "IDX_XDN_DFN",
                    columnNames = {House.XDN, House.DFN}
            )
    }
)

public class House {
    public final static String TABLE_NAME = "house";
    public final static String XDN = "xdn";
    public final static String DFN = "dfn";

    @Id
    @GeneratedValue
    private long Id;

    @Column(name = XDN)
    private long xdn;

    @Column(name = DFN)
    private long dfn;

    @Column
    private String address;

    public long getId() {
        return Id;
    }

    public void setId(long id) {
        this.Id = id;
    }

    public long getXdn() {
        return xdn;
    }

    public void setXdn(long xdn) {
        this.xdn = xdn;
    }

    public long getDfn() {
        return dfn;
    }

    public void setDfn(long dfn) {
        this.dfn = dfn;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

Когда jboss / hibernate пытается создать таблицу "house", он выдает следующее исключение:

Reason: org.hibernate.AnnotationException: @org.hibernate.annotations.Table references an unknown table: house

Ответы [ 3 ]

16 голосов
/ 03 февраля 2010

Пожалуйста, попробуйте следующее:

@Entity
@org.hibernate.annotations.Table(appliesTo = House.TABLE_NAME,
    indexes = {
            @Index(name = "IDX_XDN_DFN",
                    columnNames = {House.XDN, House.DFN}
            )
    }
)
@Table(name="house")
public class House {
    ...
}

Обратите внимание, что это также должно позволить вам создать многостолбцовый индекс (на основе имени индекса):

@Index(name = "index1")
public String getFoo();

@Index(name = "index1")
public String getBar();

P.S .: Какую версию Hibernate вы используете BTW? Какая база / диалект?

1 голос
/ 24 февраля 2010

Вы должны иметь hibernate.hbm2ddl.auto для создания в persistence.xml. Когда установлено обновление hibernate не будет создавать индексы.

hibernate.hbm2ddl.auto = create

0 голосов
/ 02 февраля 2010

Вам лучше пойти с составным первичным ключом.

В этой статье объясняется, как это сделать с аннотациями JPA. Он использует @Embeddable и @EmbeddedId

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