gpt4 book ai didi

java - 编辑实体而不执行@PreUpdate方法

转载 作者:太空宇宙 更新时间:2023-11-04 06:08:49 25 4
gpt4 key购买 nike

在我的应用程序中的几乎每个实体类中,当用户更改实体时,都有一个时间戳字段来保存时间。对于该行为,我使用一个简单的方法,用 @PreUpdate 注释来将此字段的值设置为当前的 java.util.Date

此基本功能被排除在某些 BasicEntity 类中,我正在扩展该类以实现特定的实现。所以它基本上看起来像这样:

@MappedSuperclass
public abstract class BasicEntity {
// ...
@PreUpdate
public void preupdate() {
this.lastupdate = new java.util.Date();
}
}

@Entity
public class User extends BasicEntity {
private java.util.Date lastlogin;
}

现在我不仅需要保存上次更新操作的时间,还需要保存用户登录系统的时间。因此,目前,在我的登录方法中,我将上次登录的字段设置为当前日期,并通过 EntityManager 保存此 User 实例的当前状态。当然,由于我的 @PreUpdate 方法,最后一次更新的字段也被设置了。

我不希望在这种特定情况下发生这种情况!不知何故,我希望能够更改 laSTLogin 字段的值,而不更改 lastupdate 字段的值。

您对我在这种情况下如何实现这一目标有什么建议吗?由于 BasicEntity 提供了许多附加功能,我想避免回去扩展它。

<小时/>

当前尝试:

@MappedSuperclass
public abstract class BasicEntity {
// ...
@PreUpdate
public void preupdate() {
this.lastupdate = new java.util.Date();
}
}

@Entity
public class User extends BasicEntity {
@Transient
protected volatile transient boolean login = false;

@Override
@PreUpdate
public void preupdate() {
if (!login) {
super.preupdate();
}
login = false;
}
}

在我的登录方法中,我正在执行以下操作:

getUser().setLogin(true);    
userFacade.edit(getUser());

但是现在,执行User的preupdate()方法时,login的值仍然是false

最佳答案

你可以这样做:

    @MappedSuperclass
public abstract class BasicEntity {
// ...
@Transient
protected volatile transient boolean updated = true;

@PreUpdate
public void preupdate() {
if(updated){
this.lastupdate = new java.util.Date();
}
}
}

@Entity
public class User extends BasicEntity {
private java.util.Date lastlogin;

public void setLastLogin(Date lastlogin){
this.lastlogin = lastlogin;
this.updated = false;
}

}

关于java - 编辑实体而不执行@PreUpdate方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28985973/

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