2010-02-02 49 views
6

早上好。如何在hibernate實體中通過幾列定義索引?

我需要在hibernate實體中添加索引。據我所知,可以使用@Index註釋來爲單獨的列指定索引,但我需要一個實體的幾個字段的索引。

我google了,發現jboss註釋@表,它允許做到這一點(通過規範)。但是(我不知道爲什麼)這個功能不起作用。可能是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時/休眠試圖創建表 「房子」,它拋出異常如下:

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

順便說一句,你都應該爲接受(以下票打勾)標記的答案,如果他們適合你。 – Bozho 2010-02-02 09:34:05

+0

@foobar - 你解決了你的問題嗎? – Bozho 2010-02-23 20:52:12

+0

我希望通過使用SQL腳本手動創建索引。你的建議是正確的,但我想這就像用戶用作休眠方法的黑客。而且這種方法不可能有資格獲得另一個持久性提供者。這個問題已經解決了,但是在將來我想花更多的時間來實現如何以最好的方式來完成這項任務。我會在這裏寫下結果... 非常感謝。 – 2010-03-03 14:15:22

回答

-1

你」最好使用複合主鍵。

This article解釋瞭如何使用JPA批註執行此操作。它採用@Embeddable@EmbeddedId

+0

謝謝。使用JPA特定的API是正確的事情,但...它仍然不清楚爲什麼它不能在jboss上工作。我試圖使用指定@Index註釋的同一個類用於單獨的字段,但它不起作用。 – 2010-02-02 09:42:10

+0

你讀過這篇文章了嗎?使用'Embeddable'和'EmbeddedId'。 – Bozho 2010-02-02 09:50:54

+0

沒有必要讓實體可嵌入到我的業務邏輯中。必須有更簡單的決定。但不知道如何去做...... 是的,我讀過那篇文章。 – 2010-02-02 09:54:42

14

請嘗試以下方法:

@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使用BTW?什麼數據庫/方言?

1

您必須將hibernate.hbm2ddl.auto設置爲在persistence.xml中創建。當設置爲更新時,hibernate不會創建索引。

hibernate.hbm2ddl.auto = create

+0

我試圖做你喜歡的悲傷,但索引不創建 – 2010-03-03 14:10:37

+0

可能是因爲jboss版本 – 2010-03-03 14:22:17

+0

似乎它不是一般的真實;對於我來說,即使使用'hibernate.hbm2ddl.auto = update'創建索引。 – 2014-04-06 16:44:36