jpa 无法显式更新Sping Boot 应用程序中实体的@LastModifiedBy和@LastModifiedDate注解列的值

g6ll5ycj  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(194)

我在我的一个Spring引导应用程序中使用了以下Hibernate实体。

@Entity
@Table(name = "Student")
public class Student extends AbstractAuditingEntity implements Serializable {

  private static final long serialVersionUID = 1L;

  @Id
  private String id;

  @Column(name = "name")
  private String name;

  @Column(name = "description")
  private String description;

  ...
}

AbstractAuditingEntity的计算公式如下:

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

  private static final long serialVersionUID = 1L;

  @CreatedBy
  @Column(name = "created_by", nullable = false, length = 50, updatable = false)
  @JsonIgnore
  private String createdBy;

  @CreatedDate
  @Column(name = "created_date", updatable = false)
  @JsonIgnore
  private Instant createdDate = Instant.now();

  @LastModifiedBy
  @Column(name = "last_modified_by", length = 50)
  @JsonIgnore
  private String lastModifiedBy;

  @LastModifiedDate
  @Column(name = "last_modified_date")
  @JsonIgnore
  private Instant lastModifiedDate = Instant.now();
  ...
  }

在所有现有流中,lastModifiedBylastModifiedDate均正确填充。
现在,在一个新的流程中,我正在从另一个系统同步上述实体,并且我希望显式更新lastModifiedDatelastModifiedBy的值。我已经尝试了下面的更新查询来更新这两个字段,但它不起作用。

@Modifying(flushAutomatically = true)
@Query("update Student u set " +
      "u.lastModifiedBy = :lastModifiedBy, " +
      "u.lastModifiedDate = :lastModifiedDate " +
      "where u.id = :id")
  void updateLastModifiedInformation(@Param("lastModifiedBy") String lastModifiedBy,
                                            @Param("lastModifiedDate") Instant lastModifiedDate,
                                            @Param("id") String id);

即使在更新之后,我也看到lastModifiedDatelastModifiedBy列分别填充了当前日期和当前登录用户,这是我不希望看到的。
我没有得到任何线索,如何使这工作。

    • 编辑**:

在评论中给出建议后,我尝试了原生查询,如下所示,但还是一样:

@Modifying
@Query(value = "update Student u set " +
      "u.last_modified_by = :lastModifiedBy, " +
      "u.last_modified_date = :lastModifiedDate " +
      "where u.id = :id", nativeQuery = true)
  void updateLastModifiedInformation(@Param("lastModifiedBy") String lastModifiedBy,
                                            @Param("lastModifiedDate") Instant lastModifiedDate,
                                            @Param("id") String id);

有人能帮帮忙吗?谢谢。

5tmbdcev

5tmbdcev1#

我试着重复你的问题,这里有一个可能的解决方案。
首先在AbstractAuditingEntity中定义setLastModifiedDate方法:

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

通过调用student.setLastModifiedDate(date),您将能够设置您选择的最后修改日期并保存到StudentRepo,我在StudentServ中使用以下方法测试了它:

public void testUpdateLastModifiedDate(String id, Student student, Instant instant){
  student.setId(id);
  student.setLastModifiedDate(instant);
  studentRepo.save(student);
}

lastModifiedDate将更新为您输入的instant
lastModifiedBy字段应采用类似方式处理。
希望能有所帮助。
编辑:
对于修改后的查询,以下内容应该与您想要实现的内容更加相似:

public void update(String id, Instant lastModifiedDate, String lastModifiedBy){
  Optional<Student> opt = studentRepo.findById(id);
  if(opt.isEmpty()) return;

  Student student = opt.get();
  student.setLastModifiedDate(lastModifiedDate);
  student.setLastModifiedBy(lastModifiedBy);
  studentRepo.save(student);
}

相关问题