gpt4 book ai didi

java - 在jpa中保存对象之前如何知道id

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:03 25 4
gpt4 key购买 nike

我有一个新对象。我想在保存之前知道 id 。可能吗?或者还有另一种方法吗?我使用 jpa 作为 orm,使用 oracle 作为数据库。

@Id
@Basic(optional = false)
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "woTypeSeq")
private Long id;

我的实体中有一个代码字段。如果用户没有为 code 字段输入值,我想将代码设置为实体的 ID。如果我坚持实体,当然我可以得到 id 并将代码值设置为 id,但这是额外的查询数据库。

我想做这样的事情

if(entity.getCode()==null) {
entity.setCode(entity.getId);
jpaDao.saveOrUpdate(entity);
}

最佳答案

使用@GeneratedValue 类型标识,您无法提前知道该值(在实际写入之前)。然而,一旦您持久化 Bean,id 字段将填充到该 bean 实例中,您无需对其进行额外查询即可获取它。换句话说:

MyEntiry myEnt = new MyEntity(); //the id field is null now
entityManager.persist(myEnt);//the id field is populated in myEnt now
Long id = myEnt.getId();

此外,根据您的 EntityManager 的配置方式,您可能还需要先(手动)提交事务,然后才能获取该 ID。

根据评论更新

如果您想在保存和/或更新实体之前拦截实体并对其执行某些操作,您可以使用 JPA LifeCycle Listeners(如果您使用的是 JPA 版本 2):Handling JPA lifecycle event using listeners and callbacks .

基本上你可以在你的 bean 中创建一个 validate() 方法,用 @PrePersist@PreUpdate 注释它并在它(如果代码为空,将其设置为 id 的值)

根据第二条评论更新

是的,老实说,我刚刚才想到:如果 id 是自动生成的,它可能会在 pre-persist 事件之后被填充,这样当你的 pre-persist 代码被执行时你仍然不知道是什么id 是(您可能还会注意到,在您链接到 id 的示例中,它不是自动生成的,而是手动设置的)。在这种情况下,您可以做的是向您的实体添加一个名为 isCodeEmpty 的 boolean 字段(用 @Transient 注释,这样它就不会持久化)(默认情况下为 false如果没有专门初始化)。然后在您的 @PrePersist 注释方法中检查代码字段的值是否为空,如果是,则将 boolean 值设置为 true。然后你重构你的 setId(...) 方法,这样(除了设置 id 字段)它将检查这个 boolean 值,如果为真,则将代码字段的值设置为 id 字段的值:

public class YourEntity {

@Transient
private boolean isCodeEmpty;

public void setId(Whatever id) {
this.id = id;
if(isCodeEmpty) {
this.code = id;
//if necessary:
//this.isCodeEmpty = false;
}
}

@PrePersist
public void validate() {
if(code == null || code.isEmpty()) {
isCodeEmpty = true;
}

}


}

关于java - 在jpa中保存对象之前如何知道id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12742826/

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