gpt4 book ai didi

mysql - 如何使用 JPA/Hibernate 设置复合主键的列顺序

转载 作者:可可西里 更新时间:2023-11-01 07:49:08 24 4
gpt4 key购买 nike

我在对复合主键中的列进行排序时遇到问题。我有一个包含以下内容的表格:

@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 个位置,但每个位置有很多纪元。

任何帮助将不胜感激 =)

最佳答案

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

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

private byte loc;
private long epochtime;

你会像现在这样得到:

(`epochtime`,`loc`)

但是如果您重命名它们,例如:

private byte aloc;
private long epochtime;

它将生成为:

(`aloc`, `epochtime`)

a 在 e 之前。

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

关于mysql - 如何使用 JPA/Hibernate 设置复合主键的列顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8139437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com