hibernate联合主键导致创建表失败

最近在做项目时碰到了使用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中没有这个限制的话可以不用做修改,或根据相应限制做对应修改。

猜你喜欢

转载自ligangty.iteye.com/blog/1151943
今日推荐