2016-11-15 100 views
0

在我的實體中有一個名爲id的字段,標記爲@Id(我手動設置)並知道我想知道,是否有可能自動生成一個唯一的Id(@ GeneratedValue),但我也想手動設置ID,當沒有設置時它應該自動生成它。JPA @GeneratedValue和@Id

例子:

@Id 
@GeneratedValue 
private long id; 

創建實體

new Entity(someid) //Once with ID and no generated value 
new Entity() //Second without ID and generated unique value 

我希望你能理解我的。

+1

請解釋一個「長」字段可以如何「未設置」?如果這是一個很長的時間,那麼我可能會理解,但不會太長。 –

回答

2

嗯,我不認爲這會奏效。 JPA自動生成您的ID值,並負責@GeneratedValue。問問自己'如果已經存在一個ID爲100的實體,會發生什麼情況。我手動創建一個ID爲100'的新實體。直覺上我會說JPA(或實現)引發了一種期待。

在寫上面的回答我得到了寫自己的發電機(在所有沒有嘗試過的想法,只是編碼到這裏的計算器。

你可以通過自己的實現發電機的@GeneratedValue註釋

@Id 
@GeneratedValue(startegy = GenerationType.IDENTITY, generator="generatedIdOrCustomId") 
@GenericGenerator(name="generatedIdOrCustomId", strategy="GeneratedIdOrCustomId") 
private Long id; 
... 

而定製的實現應該是這樣的:

public class GeneratedIdOrCustomId extends IdentityGenerator { 

@Override 
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException { 
    if (((YourEntity) obj).getId() == null) { 
     // the id is null, let JPA create an id. 
     return super.generate(session, obj); 
    } else { 
     // the id is set and should not be generated by JPA. 
     return ((YourEntity) obj).getId(); 
    } 
} 

的產生m個方法只是一個快速和骯髒的實現。在這種情況下,你必須檢查例如obj == null並拋出(Hibernate)Exception

+0

好的,會有問題。謝謝。 –

相關問題