Как установить порядок столбцов составного первичного ключа, используя JPA / Hibernate - PullRequest
3 голосов
/ 15 ноября 2011

У меня проблемы с упорядочением столбцов в моем составном первичном ключе. У меня есть таблица, которая содержит следующее:

@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;
    }
}

Когда я создаю подкласс AbstractMessage с конкретным классом @Table, 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 лок, но много эпох для каждого лок.

Любая помощь будет оценена =)

Ответы [ 2 ]

9 голосов
/ 18 сентября 2014

Есть способ сделать это. Как hibernate выбирает порядок набора столбцов для первичного ключа в алфавитном порядке по определенным именам объектов.

Так, например, если вы объявите свои объекты так:

private byte loc;
private long epochtime;

Вы получите, как вы получаете сейчас:

(`epochtime`,`loc`)

Но если вы переименуете их, например, в ::100100

private byte aloc;
private long epochtime;

Это сгенерирует это как:

(`aloc`, `epochtime`)

Как и прежде, чем е.

Это то, что я узнал, когда хотел, чтобы мой кластерный индекс был в определенном порядке. Я знаю, что это раздражает, но это единственный способ, который я мог найти, чтобы мне не пришлось менять свою схему вручную.

0 голосов
/ 15 ноября 2011

Я действительно не думаю, что есть способ сделать это. Все, что я могу сделать, - это предложить вам использовать оператор SQL create (измените его на правильный порядок) и запустить его вручную в рабочей среде.

В тестах пусть Hibernate сделает свое дело.

...