gpt4 book ai didi

java - hibernate @PreUpdate : check what has been changed

转载 作者:行者123 更新时间:2023-11-30 11:11:04 26 4
gpt4 key购买 nike

问题: 如何检查在使用 @PreUpdate 注释的方法中更改了哪些字段?


可选:如果上述问题的答案是“这是不可能的,那么也许有其他方法可以解决我的问题”

I want 自动更新 modified Tourist 的字段,每次我们更改其中的内容时。

除非情况我们只修改location。意味着如果我们只改变 location - 它应该被持久化,但是 modified 不能改变。

已有代码:

@Entity
public class Tourist {

private long id;
private String firstName;
private String lastName;
private Date created;
private Date modified;
private String location;

@PreUpdate
public void preUpdate() {
modified = new Date(); //PROBLEM : change modified even if only location field has been changed!
}
....
}

更新:经过一些调查,我发现我可以借助拦截器(扩展 EmptyInterceptor)解决它:

public class TouristInterceptor extends EmptyInterceptor{

Session session;
private Set updates = new HashSet();

public void setSession(Session session) {
this.session=session;
}

public boolean onFlushDirty(Object entity,Serializable id,
Object[] currentState,Object[] previousState,
String[] propertyNames,Type[] types)
throws CallbackException {

if (entity instanceof Tourist){
if (somethingChangedExceptLocation())
updates.add(entity);
}
return false;
}

但这种方法的缺点是当你需要拦截单个实体时,拦截所有内容。

更新的问题:

  • 如何只拦截 Tourist 实体刷新调用?
  • 是否可以借助事件来做同样的事情?表示包含新旧状态的 PreUpdateEvent

最佳答案

有一个简单的非 JPA 解决方案,如下所示,但它确实有一些重复的代码,但是当您没有太多字段时,这是一个解决方案:

@Entity
public class Tourist {

private long id;
private String firstName;
private String lastName;
private Date created;
private Date modified;
private String location;

public void setFirstName(String firstName){
if(! this.firstName.equals(firstName){
modified = new Date();
}

this.firstName = firstName;
}

public void setLastName(String lastName){
if(! this.lastName.equals(lastName){
modified = new Date();
}

this.lastName= lastName;
}
}

否则,我会按照另一个答案中的建议保存之前的加载状态,但会以更简洁的方式进行。

@Entity
public class Tourist {

private long id;
private String firstName;
private String lastName;
private Date created;
private Date modified;
private String location;

@Transient
private Tourist previousState;

@PostLoad
public void setPreviousState() {
previousState = new Tourist();
//copy fields
}

@PreUpdate
public void preUpdate() {
if (isModified()) {
modified = new Date();
}
}

private boolean isModified() {
boolean modified = false;

if (!firstName.equals(previousState.firstName) {
modified = true;
}

//check other fields

return modified;
}
}

关于java - hibernate @PreUpdate : check what has been changed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27548300/

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