2011-11-07 118 views
0

我已经使用Hibernate(默认)ORM提供程序创建了接缝应用程序。在坚持一个实体,它抛出以下错误:Hibernate @GeneratedValue在持久化实体之前不会生成主键

Caused by: java.sql.SQLException: Field 'COUNTRY_ID' doesn't have a default value 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 

其抛出,因为不是由Hibernate持久实体之前生成的主键。

@Entity 
@Table(name = "country") 
public class Country implements java.io.Serializable { 

private Integer countryId; 
//other instance variables... 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "COUNTRY_ID", unique = true, nullable = false) 
public Integer getCountryId() { 
return this.countryId; 
} 

public void setCountryId(Integer countryId) { 
this.countryId = countryId; 
} 

当我使“国家”表,即变化使COUNTRY.COUNTRY_ID如AUTO_INCREMENT(MySQL数据库),那么上面的代码仍然存在国家实体。即使尝试策略后

@GeneratedValue(strategy = GenerationType.IDENTITY) 

如果我不使COUNTRY_ID为AUTO_INCREMENT,则会发生错误。

那么,是否有必要在表中自动增加主键?为什么在数据库表中未将主键标记为AUTO_INCREMENT的情况下,在保持实体之前,Hibernate不会创建唯一的主键(使用HiLo算法)。

在此先感谢。

问候

回答

1

GenerationType.AUTO意味着,Hibernate会选择一个生成策略取决于数据库功能:为MySQL将选择身份策略。在你的情况下,指定GenerationType.AUTO与GenerationType.IDENTITY相同。

反过来,GenerationType.IDENTITY需要在您的id列上有一个自动增量。

如果您希望hibernate将值分配给您的id列,那么您应该尝试其他策略:例如hilo。但是,让hibernate为您的id列指定值仅建议用于测试。

+0

感谢您的意见。因此,Hibernate(GenerationType.AUTO)为GenerationType.IDENTITY选择MySQL的生成策略,我们需要在id列上自动增加。但是,随着应用程序的增长,GenerationType.IDENTITY的性能相对较差。哪一个是用于MySQL数据库的最佳策略? –