Как определить индекс на несколько столбцов в, в спящем режиме объект?

Доброе утро.

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

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

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

версия 4.2.3 jboss. 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 пытается составить таблицу "дом", это выдает следующее исключение:

Reason: org.hibernate.AnnotationException: @org.hibernate.annotations.Table references an unknown table: house
7
задан Pascal Thivent 1 May 2010 в 00:41
поделиться

3 ответа

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

Эта статья объясняет, как это сделать с аннотациями JPA. Он использует @EMBEDDable и @embeddedid

-1
ответ дан 6 December 2019 в 12:50
поделиться

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

@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();

PS: Какую версию Hibernate вы используете? Какую базу данных / диалект?

16
ответ дан 6 December 2019 в 12:50
поделиться

В persistence.xml необходимо установить hibernate.hbm2ddl.auto на create. Если установлено значение update, hibernate не будет создавать индексы.

hibernate.hbm2ddl.auto = create

1
ответ дан 6 December 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: