JPA @GeneratedValue和@Id

JPA @GeneratedValue和@Id

问题描述:

在我的实体中有一个名为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

请解释一个“长”字段可以如何“未设置”?如果这是一个很长的时间,那么我可能会理解,但不会太长。 –

嗯,我不认为这会奏效。 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

好的,会有问题。谢谢。 –