如何在hibernate实体中通过几列定义索引?

Zau*_*r_M 7 java orm jboss hibernate

早上.

我需要在hibernate实体中添加索引.据我所知,可以使用@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当jboss/hibernate尝试创建表"house"时,它抛出以下异常:

Reason: org.hibernate.AnnotationException: @org.hibernate.annotations.Table references an unknown table: house
Run Code Online (Sandbox Code Playgroud)

Pas*_*ent 16

请尝试以下方法:

@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 {
    ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,这还应该允许您创建多列索引(基于索引名称):

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

@Index(name = "index1")
public String getBar();
Run Code Online (Sandbox Code Playgroud)

PS:你使用什么版本的Hibernate BTW?什么数据库/方言?


Boz*_*zho -1

您最好使用复合主键。

本文解释了如何使用 JPA 注释来做到这一点。它使用@Embeddable@EmbeddedId

  • 注意:在 Oracle 中,复合主键不能包含具有空值的列,但复合唯一索引可以包含具有空值的列。因此,这个答案在某些情况下没有意义(特别是当您希望允许一个或多个列包含空值并且是复合的时......) (3认同)