2014-03-03 38 views
13

我想使用沒有@Id註釋的生成的UUID,因爲我的主鍵是別的東西。應用程序不會生成UUID,您有想法嗎?如何在Hibernate中使用UUID作爲字段?

這是我的聲明:

@Column(name = "APP_UUID", unique = true) 
@GeneratedValue(generator="system-uuid") 
@GenericGenerator(name="system-uuid", strategy = "uuid") 
private String uuid; 

我使用Hibernate 4.3.0與Oracle10g的。

+0

你有沒有找到解決辦法?我有同樣的問題。 – rand0m86

+0

我使用最後一個答案作爲修補程序 –

+0

@FlorianMozart您應該接受最後一個答案 – jlb

回答

8

試試這個,它可以幫助

@Id 
@GeneratedValue(generator = "hibernate-uuid") 
@GenericGenerator(name = "uuid", strategy = "uuid2") 
@Column(name = "uuid", unique = true) 
private String uuid; 

閱讀本link讀取休眠文件有可能

+0

我使用了您的解決方案而沒有@Id註釋。沒有改進:/ –

+0

Eclipse引發錯誤:「這個類有一個複合主鍵,它必須使用一個ID類。」 –

+2

@工程師 - 你應該給你的答案增加更多的解釋。鏈接可能會過時。引用來源絕對是適當的,但你應該提供適當的,全面的迴應。 –

2

這不是因爲你的UUID是主鍵,它是強制性的把它與@GeneratedValue annoted。

例如,你可以這樣做:

String uuid = UUID.randomUUID().toString(); 
em.persist(new MyClass(uuid)); // em : entity manager 
+0

我知道有兩次UUID的可能性不大,但可能會發生。這就是爲什麼我想通過休眠來管理UUID。感謝您的幫助 –

+0

Hibernate確實無法防止ID衝突(尤其是,如果數據庫中第一個值已存在,它不會生成新值) –

4

檢查的GeneratedValue的Javadoc:

public class MyClass 
{ 
    @Id 
    private String uuid; 

    public MyClass() {} 

    public MyClass (String uuid) { 
     this.uuid = uuid; 
    } 
} 

而在你的應用程序,節省您的實體之前生成UUID

Provides for the specification of generation strategies for the values of primary keys.

換句話說 - 只有一個註釋來初始化一個'non e ID'屬性。

但是你可以使用@PrePersist

@PrePersist 
public void initializeUUID() { 
    if (uuid == null) { 
     uuid = UUID.randomUUID().toString(); 
    } 
} 
相關問題