2009-08-19 23 views
28

Điều này (nên) là một điều khá đơn giản để làm, tuy nhiên tôi đang vật lộn.Thứ tự sai trong bảng được tạo trong jpa

Tôi muốn có một bảng được tạo ra như thế này:

 
id 
organizationNumber 
name 

Tuy nhiên, khi tôi nhìn vào cơ sở dữ liệu, tôi thấy rằng thứ tự là sai. Có ai biết làm thế nào tôi có thể lực lượng hibernate/jpa để tạo ra bảng với thứ tự chính xác?

 
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 |    | 
+--------------------+--------------+------+-----+---------+----------------+ 

Đây là cách entity bean của tôi trông giống như:

 
@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; 
    } 
} 

Trả lời

44

Hibernate tạo cột trong chữ cái trật tự. Theo this post lý do được đưa ra là:

Nó được sắp xếp để xác định chắc chắn đặt hàng qua các cụm.

Chúng tôi không thể dựa vào vm để trả về các phương thức theo cùng thứ tự mỗi lần vì vậy chúng tôi phải làm điều gì đó.

Dường như nó được sử dụng theo thứ tự xuất hiện nhưng điều này đã thay đổi giữa 3.2.0 GA và 3.2.1 GA.

Tôi cũng tìm thấy Schema auto generation creates columns in alphabetical order for compound primary keys và điều này có vẻ giống như vấn đề của bạn. Vé này là về thứ tự thay đổi trong khóa chính và tác động tiêu cực đến hiệu suất của chỉ mục.

Không có cách khắc phục nào khác ngoài giải pháp đặt tên cho các cột theo cách mà chúng xuất hiện theo đúng thứ tự (không, tôi không đùa).

+1

Câu trả lời của bạn về lý do tại sao theo cách này là chính xác, vì không có thứ tự thực sự khi nói đến chú thích. Một giải pháp khác không sử dụng tạo tự động lược đồ. –

+0

Bạn không thể sử dụng sự phản chiếu, lặp qua các trường và tạo danh sách cột theo cách đó? – cletus

+9

LOL. Tôi không thể hiểu làm thế nào khó có thể có một giá trị trong @Column (order = 1) để nó có một yếu tố thứ tự và sau đó đảm bảo đặt hàng chính xác. Tuy nhiên, cảm ơn bạn đã trả lời. –

2

DataNucleus cho phép tiện ích xác định vị trí cho việc tạo giản đồ, FWIW.

+0

Tôi sẽ đề nghị: Ngay sau khi một bảng được tạo ra bởi Hibernate, bạn có thể thay đổi nó để đặt hàng các cột theo cách bạn muốn. Tôi đã làm như vậy. Các công cụ như Toad sẽ làm cho nó rất dễ dàng thông qua tùy chọn cột lên/xuống trên giao diện người dùng –

Các vấn đề liên quan