2009-08-19 49 views
28

這(應該)是一件相當簡單的事情,但我正在掙扎。jpa中產生的表錯誤訂購

我想是這樣產生的表:

 
id 
organizationNumber 
name 

然而,當我看到在數據庫中,我看到的排序是錯誤的。有誰知道我可以如何強迫hibernate/jpa以正確的順序生成表格嗎?

 
desc Organization; 
+--------------------+--------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+--------------------+--------------+------+-----+---------+----------------+ 
| id     | bigint(20) | NO | PRI | NULL | auto_increment | 
| name    | varchar(255) | NO |  | NULL |    | 
| organizationNumber | varchar(255) | NO | UNI | NULL |    | 
+--------------------+--------------+------+-----+---------+----------------+ 

這是我的實體bean的樣子:

 
@Entity 
@NamedQuery(name = "allOrganizations", query = "SELECT org FROM Organization org order by name") 
public class Organization { 

    private Long id; 
    private String organizationNumber; 
    private String name; 

    public Organization() { 
    } 

    public Organization(String name) { 
     this.name = name; 
    } 

    @Id 
    @GeneratedValue 
    public Long getId() { 
     return id; 
    } 

    @SuppressWarnings("unused") 
    private void setId(Long id) { 
     this.id = id; 
    } 

    @NotEmpty 
    @Column(unique=true, nullable=false) 
    public String getOrganizationNumber() { 
     return organizationNumber; 
    } 
     public void setOrganizationNumber(String organizationNumber) { 
     this.organizationNumber = organizationNumber; 
    } 


    @NotEmpty 
    @Column(nullable=false) 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return this.name + " " + this.organizationNumber; 
    } 
} 

回答

44

休眠中字母順序生成列。

它進行排序以ensurce跨集羣確定性 排序:根據this post如給出的理由。

我們不能依靠vm每次都以相同的順序返回 方法 所以我們不得不做一些事情。

顯然它過去是按照發生的順序,但是這在3.2.0 GA和3.2.1 GA之間改變了。我也發現Schema auto generation creates columns in alphabetical order for compound primary keys,這似乎是你的問題。這張票是關於主鍵變化的訂單,並且對指數表現有負面影響。

除了以這樣一種方式命名列的解決方法之外,沒有其他解決方法,它們以正確的順序排列(不,我不是在開玩笑)。

+1

關於爲什麼它是這種方式的答案是正確的,因爲在註釋時沒有真正的順序。 另一種解決方案是不使用模式自動生成。 – 2009-08-19 07:51:39

+0

難道你不能使用反射,遍歷字段和構建列列表的方式? – cletus 2009-08-19 07:59:37

+9

大聲笑。我不明白在@Column(order = 1)中有一個值是多麼困難,因此它需要一個order元素,然後確保正確的排序。儘管如此,謝謝你的回答。 – 2009-08-19 14:46:55

2

DataNucleus允許擴展名指定模式生成的位置FWIW。

+0

我會建議:儘快創建一個由Hibernate創建的表,您可以改變它以按照您想要的方式對列進行排序。我已經這樣做了。像蟾蜍這樣的工具將通過UI上的列向上/向下選項使其變得非常簡單 – 2016-07-15 02:58:56