在我的应用程序中的几乎每个实体类中,当用户更改实体时,都有一个时间戳字段来保存时间。对于该行为,我使用一个简单的方法,用 @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/