2013-03-17 72 views
4

對不起,如果這個問題已經被問到,我讀過一些文章,但沒有找到答案。如何使字符串主鍵休眠。 @GeneratedValue策略

我的目標是創建具有唯一字段IMEI的實體設備,並且我想將其用作主鍵,並在設備註冊時指定它(手動指定,同時創建實體)。 我使用Spring roo工具進行開發,並使用hibernate作爲ORM。

當我在實體聲明中指定這樣的:

@RooJavaBean 
@RooToString 
@RooJpaActiveRecord(identifierField = "IMEI", identifierType = String.class) 
public class Device {...} 

我得到這個生成。

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "IMEI") 
private String Device.IMEI; 

雖然與MySQL數據庫部署項目的服務器我得到這個錯誤

2013-03-17 20:03:23,136 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: create table device (imei varchar(255) not null auto_increment, model varchar(255), name varchar(255) not null, version integer, primary key (imei)) 
2013-03-17 20:03:23,136 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Incorrect column specifier for column 'imei' 

然後我重寫袋鼠產生的場

@Id 
@GeneratedValue(generator = "org.hibernate.id.Assigned") 
@Column(name = "the_code") 
private String code; 

(我發現這hear

但仍然出錯,然後我已將代碼簡單地更改爲此

@Id 
private String IMEI; 

然後它工作正常,並要求我在保存實體之前指定imei字段。

我的問題是:

是否使用我的自定義字段作爲id是正確的。

是它確定要由字符串

是它確定它不與休眠產生,但是從設備IMEI服用。

什麼org.hibernate.id.Assigned

爲什麼袋鼠的@RooJpaActiveRecord(identifierField = 「IMEI」,identifierType = String.class)不起作用生成的代碼。

是更多鈔票來創建字符串自動生成primery關鍵

什麼是默認GeneratedValue戰略價值(我最後的情況下)

我讀過official doc,但沒有理解所有,請參考我第我岑讀了這一切。

謝謝,對不起長時間的問題。

回答

11

@GeneratedValue(strategy = GenerationType.AUTO)不能與String類型一起使用。因此,如果您想使用String作爲ID,則必須手動分配它。但如果它適合您的需要,可以使用String作爲ID。

使用org.hibernate.id.Assigned也意味着您必須在保存數據之前分配ID值。

@GeneratedValue未添加註釋時,默認爲分配生成器,這意味着標識符的值必須由應用程序設置。

詳情請參閱the hibernate manual

11

一個簡單的解決方案可能是在您的實體類上使用@PrePersist註釋。

只需添加方法

@PrePersist 
private void ensureId(){ 
    this.setId(UUID.randomUUID().toString()); 
} 

,並擺脫@GeneratedValue註釋。

PrePersist文檔:http://docs.oracle.com/javaee/5/api/javax/persistence/PrePersist.html

斯特凡諾

+0

謝謝,它的工作原理就像一個魅力! – 2013-12-30 19:25:47

+0

但是如果生成的ID已經存在於表中呢?雖然,這個ID是安全生成的,但至少有一個機會可以讓這個ID出現在表格中? – user12458 2014-07-10 17:58:17

+0

正如文檔所述,UUID是一個「不可變的通用唯一標識符」。 – 2014-07-23 07:42:40