【问题标题】:How to set the column order of a composite primary key using JPA/Hibernate如何使用 JPA/Hibernate 设置复合主键的列顺序
【发布时间】:2011-12-29 16:18:57
【问题描述】:

我的复合主键中的列排序有问题。我有一个包含以下内容的表:

@Embeddable
public class MessageInfo implements Serializable {

    private byte loc;
    private long epochtime;

    @Column(name = "loc")
    public byte getLoc() {
        return loc;
    }    

    @Column(name = "epochtime")
    public long getEpochtime() {
        return epochtime;
    }
}

在此映射中使用:

@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class AbstractMessage implements Message {

    private MessageInfo info;
    private int blah;

    @EmbeddedId
    public MessageInfo getInfo() {
        return info;
    }
}

当我使用具体的@Table 类对 AbstractMessage 进行子类化时,hibernate 会创建没有错误的数据库和表。问题是hibernate正在生成复合主键,其中列的顺序与我想要的相反。

CREATE TABLE  `mydb`.`concrete_table` (
  `epochtime` bigint(20) NOT NULL,
  `loc` tinyint(4) NOT NULL,
  `blah` smallint(6) DEFAULT NULL,
  `foo` smallint(6) DEFAULT NULL,
  PRIMARY KEY (`epochtime`,`loc`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我希望主键是

PRIMARY KEY (`loc`,`epochtime`)

因为我知道我最多有 10 个 loc,但每个 loc 有很多 epochtime。

任何帮助将不胜感激 =)

【问题讨论】:

    标签: mysql hibernate jpa composite-primary-key


    【解决方案1】:

    有办法做到这一点。 hibernate 如何选择为主键排序一组列是按您定义的对象名称的字母顺序排列的。

    所以例如如果你这样声明你的对象:

    private byte loc;
    private long epochtime;
    

    你会得到你现在得到的:

    (`epochtime`,`loc`)
    

    但是如果你将它们重命名为例如:

    private byte aloc;
    private long epochtime;
    

    它会生成如下:

    (`aloc`, `epochtime`)
    

    a 在 e 之前。

    当我希望我的聚集索引按特定顺序排列时,我发现了这一点。我知道这很烦人,但这是我能找到的唯一方法,这样我就不必手动更改架构。

    【讨论】:

    • 我有另一种经历,在主键中,date 列位于 company 之前。即使我让 Hibernate 重新生成整个数据库方案。
    • 有什么解决办法吗?有没有办法重新排序?
    【解决方案2】:

    我真的不认为有办法做到这一点。我所能做的就是建议您使用您拥有的 SQL create 语句(将其更改为具有正确的顺序)并在生产中手动运行它。

    在测试中让 Hibernate 做它的事情。

    【讨论】:

    • 是的,这就是我们现在正在做的事情。我希望 Hibernate 可能有一些更改默认值的工具。感谢您抽出宝贵时间回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2018-08-30
    • 2020-02-19
    • 2021-10-14
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多