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

时间:2011-11-15 16:13:30

标签: 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 = "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会有很多个纪录片。

任何帮助将不胜感激=)

2 个答案:

答案 0 :(得分:9)

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

因此,例如如果你声明你的对象:

private byte loc;
private long epochtime;

你现在可以得到:

(`epochtime`,`loc`)

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

private byte aloc;
private long epochtime;

它会将其生成为:

(`aloc`, `epochtime`)

来自e。

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

答案 1 :(得分:0)

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

在测试中让Hibernate做其事。