Доброе утро.
Я должен включить индексацию, в спящем режиме объект. Поскольку я знаю, что возможно сделать использование @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
Вам лучше пойти с композитным первичным ключом.
Эта статья объясняет, как это сделать с аннотациями JPA. Он использует @EMBEDDable
и @embeddedid
Попробуйте следующее:
@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 вы используете? Какую базу данных / диалект?
В persistence.xml необходимо установить hibernate.hbm2ddl.auto на create. Если установлено значение update, hibernate не будет создавать индексы.
hibernate.hbm2ddl.auto = create