views:

93

answers:

2

Hi. This (should) be a rather simple thing to do, however I am struggling.

I want a table to be generated like this:

id 
organizationNumber 
name

However, when I look in the database, I see that the ordering is wrong. Does anybody know how I can force hibernate/jpa to generate the table with correct ordering?

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

This is how my entity bean looks like:

@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;
    }
}
+3  A: 

Hibernate generates columns in alphabetical order. According to this post the reason is given as:

It is sorted to ensurce deterministic ordering across clusters.

We can't rely on the vm to return the methods in the same order every time so we had to do something.

Apparently it used to be in the order of occurrence but this changed between 3.2.0 GA and 3.2.1 GA.

I also found Schema auto generation creates columns in alphabetical order for compound primary keys and this seems to be like your problem. This ticket is about the order changing in primary keys and that negatively impacts index performance.

There is no fix for this other than a workaround of naming the columns in such a way that they come out in the correct order (no, I'm not kidding).

cletus
Your answer about why it is this way are correct, since there is no real ordering when it comes to annotations. Another solution is not use schema auto generation.
Max Rydahl Andersen
Couldn't you use reflection, iterate over the Fields and build a column list that way?
cletus
LOL. I can't understand how difficult it can be to have a value in the @Column(order=1) so that it takes an order element and then ensures correct ordering. Nevertheless, thank you for your answer.
Shervin
A: 

DataNucleus allows the extension specifying the position for schema generation, FWIW.

DataNucleus