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

标签 java jpa

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

相关文章:

java - 如何使用 springboot findAll() 方法编写 not in 子句

hibernate - @UniqueConstraint 检查 JPA 中的多个表

mysql - 当我更新多对多关系中的实体时,如何阻止 Hibernate/JPA 删除连接表记录?

java - App Engine 应用程序性能测试

jpa - 忽略具有 PersistenceUnitTransactionType = RESOURCE_LOCAL 的持久性单元定义

java - 用听起来很普通的名字设计 Java 接口(interface),比如 "play nicely"和其他包

java - 条件 vs 等待通知机制

java - 使用 EclipseLink 时生成脚本

java - Android Studio-数据库

java - Android中制作一个public类型的人脸方法