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
我希望你能理解我的。
答
嗯,我不认为这会奏效。 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
好的,会有问题。谢谢。 –
请解释一个“长”字段可以如何“未设置”?如果这是一个很长的时间,那么我可能会理解,但不会太长。 –