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

Mysql 如何使用JPA/Hibernate设置复合主键的列顺序,mysql,hibernate,jpa,composite-primary-key,Mysql,Hibernate,Jpa,Composite Primary Key,复合主键中的列排序有问题。我有一个表,其中包含以下内容: @Embeddable public class MessageInfo implements Serializable { private byte loc; private long epochtime; @Column(name = "loc") public byte getLoc() { return loc; } @Column(name = "ep

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

@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


任何帮助都将不胜感激。

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


在测试中,让Hibernate完成它的任务。

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

例如,如果您这样声明您的对象:

private byte loc;
private long epochtime;
您将获得与现在一样的:

(`epochtime`,`loc`)
但如果您将其重命名为,例如:

private byte aloc;
private long epochtime;
它将生成以下内容:

(`aloc`, `epochtime`)
a在e之前


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

是的,这就是我们现在正在做的。我希望Hibernate可能有一些更改默认值的功能。感谢您花时间回复。我还有另一个经验,在主键中,
date
列位于
company
之前。即使我让Hibernate重新生成整个数据库方案。对此有什么建议吗?有没有办法重新排列顺序?