jpa中生成的表中的错误排序

时间:2009-08-19 07:34:29

标签: java hibernate 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;
    }
}

3 个答案:

答案 0 :(得分:72)

Hibernate以按字母顺序顺序生成列。根据{{​​3}},原因如下:

  

它被分类以确保确定性   跨群集排序。

     

我们不能依靠vm来返回   每次都以相同的顺序排列方法   所以我们必须做点什么。

显然它过去是按照发生的顺序,但在3.2.0 GA和3.2.1 GA之间发生了变化。

我还找到了this post,这似乎就像你的问题一样。此票证与主键中的订单更改有关,并对索引性能产生负面影响。

除了以正确的顺序命名列的方法(不,我不是在开玩笑)之外,没有其他方法可以解决这个问题。

答案 1 :(得分:3)

DataNucleus允许扩展指定模式生成的位置,FWIW。

答案 2 :(得分:1)

只要您可以更改类成员的内部名称,就可以设置您想要的顺序,因为列的顺序取自字段名称,而不是取自 getter、setter 或列。

因此,如果类成员是私有的(根据需要),您应该只列出它们(例如通过在它们前面加上“a_”、“b_”、“c_”、...)而不更改 getter、 setter 或列名。

例如下面的类定义:

@Id
@Column(name = "parent")
UUID parent;

@Id
@Column(name = "type", length = 10)
String type;

@Id
@Column(name = "child")
UUID child;

它生成下表:

  Column   |         Type          | Collation | Nullable | Default 
-----------+-----------------------+-----------+----------+---------
 child     | uuid                  |           | not null | 
 parent    | uuid                  |           | not null | 
 type      | character varying(10) |           | not null | 
Indexes:
    "...whatever..." PRIMARY KEY, btree (child, parent, type)

这效率不高,因为通常我们会根据父级和关系类型进行搜索以获取子级。

我们可以在不影响其余实现的情况下更改私有名称:

@Id
@Column(name = "parent")
UUID a_parent;

@Id
@Column(name = "type", length = 10)
String b_type;

@Id
@Column(name = "child")
UUID c_child;

public UUID getParent() { return a_parent; }
public UUID getChild() { return c_child; }
public String getType() { return b_type; }
public void setParent(UUID parent) { a_parent = parent; }
public void setChild(UUID child) { c_child = child; }
public void setType(String type) { b_type = type; }

因为它现在已经生成:

  Column   |         Type          | Collation | Nullable | Default 
-----------+-----------------------+-----------+----------+---------
 parent    | uuid                  |           | not null | 
 type      | character varying(10) |           | not null | 
 child     | uuid                  |           | not null | 
Indexes:
    "...whatever..." PRIMARY KEY, btree (parent, type, child)

当然依赖于班级成员的内部字典顺序不是最好的,但我没有看到更好的解决方案。