6

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

@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 进行子类化时,休眠会创建没有错误的数据库和表。问题是休眠正在生成复合主键,其中列的顺序与我想要的相反。

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。

任何帮助将不胜感激 =)

4

2 回答 2

11

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

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

private byte loc;
private long epochtime;

你会得到你现在得到的:

(`epochtime`,`loc`)

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

private byte aloc;
private long epochtime;

它将生成它:

(`aloc`, `epochtime`)

作为 a 出现在 e 之前。

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

于 2014-09-18T12:33:47.010 回答
0

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

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

于 2011-11-15T17:21:46.110 回答