JPA @GeneratedValue and @Id



在我的实体有一个字段叫id,标记的注释@Id(我手动设置),知道我想知道,是否有可能自动生成一个唯一的id(与@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(或实现)抛出了一个期望。

在写上面的答案时,我有了自己写生成器的想法(根本没有尝试过,只是在stackoverflow上写了代码)。

您可以将自己的生成器实现传递给@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();
    }
}

生成方法只是一个快速而肮脏的实现。你也必须检查,例如,如果obj == null和抛出(Hibernate)Exception在这种情况下。

最新更新