2011-11-07 58 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數據庫的最佳策略? –

相關問題