2011-11-15 51 views
3

我在我的複合主鍵中列的排序有問題。我有一個包含以下內容的表:如何使用JPA /休眠設置複合主鍵的列順序

@Embeddable 
public class MessageInfo implements Serializable { 

    private byte loc; 
    private long epochtime; 

    @Column(name = "loc") 
    public byte getLoc() { 
     return loc; 
    }  

    @Column(name = "epochtime") 
    public long getEpochtime() { 
     return epochtime; 
    } 
} 

正是在這樣的映射中使用:

@MappedSuperclass 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public abstract class AbstractMessage implements Message { 

    private MessageInfo info; 
    private int blah; 

    @EmbeddedId 
    public MessageInfo getInfo() { 
     return info; 
    } 
} 

當我繼承的AbstractMessage一個具體@Table類休眠創建數據庫和表沒有任何錯誤。問題是,hibernate正在生成與我想要的相反順序的列的複合主鍵。

CREATE TABLE `mydb`.`concrete_table` (
    `epochtime` bigint(20) NOT NULL, 
    `loc` tinyint(4) NOT NULL, 
    `blah` smallint(6) DEFAULT NULL, 
    `foo` smallint(6) DEFAULT NULL, 
    PRIMARY KEY (`epochtime`,`loc`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

我想主鍵是

PRIMARY KEY (`loc`,`epochtime`) 

因爲我知道,我將有一個最大的10分LOC的,但每個祿許多大紀元時報。

任何幫助,將不勝感激=)

回答

0

我真的不認爲有辦法做到這一點。我所能做的就是建議您使用您的SQL create語句(將其更改爲具有正確的順序)並在生產中手動運行它。

在測試中讓Hibernate做它的事情。

+0

是的,這就是我們現在要做的。我希望Hibernate可能有一些設施來改變默認設置。感謝您花時間回覆。 – Garrett

6

有一種方法可以做到這一點。 hibernate如何爲主鍵定義一組列是按照您定義的對象名稱的字母順序排列的。

因此對於例如如果你聲明你這樣的對象:

private byte loc; 
private long epochtime; 

你會得到你現在得到:

(`epochtime`,`loc`) 

但是,如果你重新命名他們如:

private byte aloc; 
private long epochtime; 

這將產生它爲:

(`aloc`, `epochtime`) 

作爲一個來自信之前。

這就是當我想讓我的聚簇索引處於特定順序時發現的。我知道這是令人煩惱的,但這是我能找到的唯一方法,以便我不必手動更改模式。

+0

我還有另一種經驗,其中''日期''列在主公鑰前面的'公司'之前。即使我讓Hibernate重新生成整個數據庫方案。 – Glorfindel