这应该是一件很简单的事情,但我正在努力。
我希望生成如下表:
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条答案
按热度按时间tct7dpnv1#
hibernate按字母顺序生成列。根据这篇文章,原因如下:
它被排序以确保集群间的确定性排序。
我们不能依赖vm每次都以相同的顺序返回方法,所以我们必须做一些事情。
很明显,它以前是按发生顺序排列的,但在3.2.0 ga和3.2.1 ga之间发生了变化。
我还发现模式自动生成会按字母顺序为复合主键创建列,这似乎是您的问题。这张罚单是关于主键顺序的变化,这会对索引性能产生负面影响。
除了以正确的顺序命名列(不,我不是开玩笑)之外,没有其他解决方法可以解决这个问题。
cmssoen22#
只要可以更改类成员的内部名称,就可以设置所需的顺序,因为列的顺序取自字段名,而不是getter、setter或column。
因此,如果类成员是私有的(如所需),则应该只列出它们(例如,在它们前面加上“a”、“b”、“c”、…),而不更改getter、setter或列名。
例如,以下类定义:
它生成下表:
这是没有效率的,因为通常我们会搜索父和类型的关系,以获得孩子。
我们可以通过执行以下操作来更改私有名称,而不影响实现的其余部分:
因为它现在已经生成:
当然,依赖于类成员的内部词典顺序不是最好的,但是我没有看到更好的解决方案。
gtlvzcf83#
datanucleus允许扩展指定模式生成的位置fwiw。