0

我有一个 Web 服务,它将持久化和删除数据库中的数据。我想在数据库中跟踪哪些用户名触及了数据库的哪些行。在每个表中都有用于存储用户名的列(如果您愿意,请更新列)。表上还有触发器,它们将获取事务的用户 ID,并使用尝试插入的用户名和密码更新该表。有没有办法在开放的 JPA 中获取用户名(将从客户端传递)并更新某种 JPA 对象,以便当 JPA 持久化数据时,该用户名将被扔到表中?

4

1 回答 1

1

最简洁的方法之一是为您的实体实现一个通用的“映射”超类,并使用带有@PrePersist注释的方法来填充字段。

@MappedSuperclass
public class AuditedEntity {
    @Id protected Integer id;
    protected String lastUpdatedBy;

    // Setters and getters here

    @PreUpdate
    @PrePersist
    public void onChange() {
        String user = .... // Do whatever is needed to get the current user
        setLastUpdatedBy(user);
    }
}


@Entity
public class Employee extends AuditedEntity {
    // ....
} 

另一种选择是使用单独的侦听器:

public interface AuditedEntity {
    public static void setLastUpdatedBy(String username);
}

@Entity
@EntityListeners({ MyLogger.class, ... })
public class Employee implements AuditedEntity {
    // ...
}

public class MyLogger {
    @PreUpdate
    @PrePersist
    public void onChange(Object o) {
        if(o instanceof AuditedEntity) {
            String user = .... // Do whatever is needed to get the current user
            ((AuditedEntity) o).setLastUpdatedBy(user);
        }
    }

    @PostPersist
    @PostUpdate
    public void logChange(Object o) {
        // Log the successful operation
    }
}
于 2012-08-27T19:54:10.653 回答