2011-11-15 26 views
3

我在我的复合主键中列的排序有问题。我有一个包含以下内容的表:如何使用JPA /休眠设置复合主键的列顺序

@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正在生成与我想要的相反顺序的列的复合主键。

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的,但每个禄许多大纪元时报。

任何帮助,将不胜感激=)

回答

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

我还有另一种经验,其中''日期''列在主公钥前面的'公司'之前。即使我让Hibernate重新生成整个数据库方案。 – Glorfindel