这应该是一件相当简单的事情,但我正在努力。
我希望像这样生成一个表:
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; } }
答案 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)
当然依赖于班级成员的内部字典顺序不是最好的,但我没有看到更好的解决方案。