最近在做项目时碰到了使用hibernate联合主键的情况。在做Unit testing的时候我希望hibernate帮我自动创建表,可是却发现总是创建失败。我使用的是mysql 5.1做为数据库,联合主键代码如下
/** * Entity class */ @Entity @Table(name="person") public class Person implements Serializable{ @EmbeddedId private PersonPK pk; @Column private String company; ....... } /** * Primary key class */ @Embeddable public class PersonPK implements Serializable{ @Column(name="name") private String name; @Column(name="email") private String email; @Column(name="address") private String address; @Column(name="id") private String id; ....... }
后来经过分析,发现在生成ddl的时候,这四个主键field会创建为长度为255字节的varchar类型column, 而mysql默认的key值长度为1000字节,从而导致这个联合主键超出长度限制(255×4>1000)而建表失败。那么解决方法就是使用columnDefinition来限定其长度。
/** * Primary key class */ @Embeddable public class PersonPK implements Serializable{ @Column(name="name", columnDefinition="varchar(50)") private String name; @Column(name="email", columnDefinition="varchar(50)") private String email; @Column(name="address", columnDefinition="varchar(50)") private String address; @Column(name="id", columnDefinition="varchar(50)") private String id; ....... }
这样的话hibernate生成ddl的时候就会使用varchar(50)来代替,从而避免联合主键过长的问题。当然如果其他DBMS中没有这个限制的话可以不用做修改,或根据相应限制做对应修改。