如何在Spring JPA中覆盖AbstractAuditingEntity的@CreatedBY值

时间:2017-06-26 20:01:28

标签: spring hibernate hibernate-envers

我们有一个microweb服务环境,其中AbstractAuditingEntity来自另一个常见的微服务。我想用我自己定义的值覆盖这个抽象类的@CreatedBy属性。

我的代码如下。

In [176]: df
Out[176]:
   a    b
0  1  5.0
1  2  NaN
2  3  6.0
3  4  NaN

In [177]: df['b'] = df['b'].fillna(df['a'])

In [178]: df
Out[178]:
   a    b
0  1  5.0
1  2  2.0
2  3  6.0
3  4  4.0

我的Domain类就像

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AbstractAuditingEntity {

@Column(name = "created_by", insertable = true, updatable = false,     nullable = false)
@CreatedBy
private String createdBy;

@Column(name = "created_date", insertable = true, updatable = false, nullable = false)
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@CreatedDate
private DateTime createdDate;

@Column(name = "last_modified_by", nullable = false)
@LastModifiedBy
private String lastModifiedBy;

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@LastModifiedDate
private DateTime lastModifiedDate;

// @Transient
public abstract Long getInternalId();

// @Transient
public abstract void setInternalId(Long internalId);

public DateTime getCreatedDate() {
return createdDate;
}

public void setCreatedDate(DateTime createdDate) {
this.createdDate = createdDate;
}

public DateTime getLastModifiedDate() {
return lastModifiedDate;
}

public void setLastModifiedDate(DateTime lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}

public String getCreatedBy() {
return createdBy;
}

public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}

public String getLastModifiedBy() {
return lastModifiedBy;
}

public void setLastModifiedBy(String lastModifiedBy) {
this.lastModifiedBy = lastModifiedBy;
}
}

当我们尝试将此域对象保留在数据库中时,我提供的用户定义值不会持续存在,而是Spring框架仍然添加自己的值。我尝试过@AttributeOverride,但它在我的情况下并不起作用。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我得到了如下解决方案。

@PrePersist
private void setCreateByNew() {
   setCreatedBy("anonymousUser");     
}

使用@PrePersist我能够覆盖我从普通框架获得的值。

答案 1 :(得分:1)

  

for:我提供的用户定义值没有得到持久化,相反Spring框架仍然添加了自己的值

您可以使用AuditorAware界面完成此操作。 3.1.3 AuditorAware

  

如果您使用@CreatedBy或@LastModifiedBy,则审核   基础设施不知何故需要了解当前的原则。   为此,我们提供您必须使用的AuditorAware SPI接口   实现告诉基础设施当前用户或系统   与应用程序交互是。泛型类型T定义   使用@CreatedBy或@LastModifiedBy注释的属性的类型   必须是。

     

这是使用Spring的接口的示例实现   安全性的身份验证对象:

     

例3.2。基于Spring Security实现AuditorAware

class SpringSecurityAuditorAware implements AuditorAware<User> {

  public User getCurrentAuditor() {

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

    if (authentication == null || !authentication.isAuthenticated()) {
      return null;
    }

    return ((MyUserDetails) authentication.getPrincipal()).getUser();
  }
}

答案 2 :(得分:0)

另一种解决方案是设置securityContext SecurityContextHolder.getContext().setAuthentication(___{AuthToken}___)

使用您要用来在实体保存之前自动填充审核字段的用户名/原则,然后在此之后将其重置。 (用于以异步方式处理消息或事件)。这将从JPA AuditAware侦听器中同时填充@Createdby@LastUpdatedBy

@PrePersist仅在如上所述尝试对预定义的字符串setCreatedBy("anonymousUser"); 进行硬编码时才有效。它不允许我们将用户名/用户名作为参数传递给方法。