`
runanli
  • 浏览: 44412 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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中没有这个限制的话可以不用做修改,或根据相应限制做对应修改。

1
4
分享到:
评论
3 楼 runanli 2012-01-10  
事实上许多BI项目都会用到联合主键的。
2 楼 fflame 2011-08-18  
aa87963014 写道
我实在是想不到有什么项目/场景需要用到联合主键的


"行政区划中各种农产品,各年产量及量纲"
理论上说是需要设置联合主键的吧?
1 楼 aa87963014 2011-08-18  
我实在是想不到有什么项目/场景需要用到联合主键的

相关推荐

Global site tag (gtag.js) - Google Analytics