gpt4 book ai didi

java - JPA @GenerateValue 和 @Id

转载 作者:行者123 更新时间:2023-12-02 03:13:58 27 4
gpt4 key购买 nike

在我的实体中,有一个名为 id 的字段,标有注释@Id(我手动设置),并且知道我想知道,是否有可能自动生成唯一 ID(使用 @GenerateValue),但我也想手动设置 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 值并负责 @GenerateValue。问问自己“如果已有一个 id 为 100 的现有实体,会发生什么。我手动创建一个 id 为 100 的新实体”。直觉上我会说 JPA(或实现)引发了一个期望。

在编写上述答案时,我想到了编写自己的生成器(根本没有尝试过,只是在 stackoverflow 上进行了编码。

您可以将自己的生成器实现传递给@GenerateValue注释

@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();
}
}

generate 方法只是一个快速而肮脏的实现。例如,您还必须检查 obj == null 是否存在,并在这种情况下抛出 (Hibernate)Exception

关于java - JPA @GenerateValue 和 @Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40604912/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com