2011-11-15 9 views
3

複合主キーの列の順序に問題があります。JPA/Hibernateを使用して複合主キーの列順序を設定する方法

@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クラスHibernateでの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; 

私は、各LOCのために10 LOCの最大のが、多くの大紀元を持っていることを知っているので、私は、主キーが

PRIMARY KEY (`loc`,`epochtime`) 

になりたいです。

任意の助けをいただければ幸い=)

答えて

0

私は本当にこれを行う方法はないと思います。私が行うことができるのは、あなたが持っているSQL create文を使用して(正しい順序を持つように変更する)、プロダクションで手動で実行することだけです。

テストでは、Hibernateはそのことを行います。

+0

今、私たちはこれをやっています。私は、Hibernateがデフォルトを変更するためのいくつかの機能を持つことを望んでいました。応答する時間をとっていただきありがとうございます。 – Garrett

6

これを行う方法があります。 hibernateがプライマリキーの列の集合をどのように並べるかは、定義されたオブジェクト名によってアルファベット順になります。

あなたはこのようなあなたのオブジェクトを宣言した場合:

private byte loc; 
private long epochtime; 

あなたが今得ているとあなたが買ってあげる:

(`epochtime`,`loc`) 

をしかし、あなたは例えばのためにそれらの名前を変更する場合:

private byte aloc; 
private long epochtime; 

それが生成されますそれは次のようになります。

(`aloc`, `epochtime`) 

これは、クラスタ化インデックスを特定の順序にしたいときに見つけたものです。私はそれが刺激的であることを知っているが、それは私がスキーマを手動で変更する必要がないように私が見つけることができる唯一の方法です。

+0

私は別の経験を持っています。ここで、列 'date'は主キーの' company'に先行しています。私がHibernateにデータベーススキーム全体を再生成させたとしても。 – Glorfindel

関連する問題