Java 在数据库中保存后,无法在保存的实体中获取lastModifiedBy列
我创建了一个JPA实体,如下所示:Java 在数据库中保存后,无法在保存的实体中获取lastModifiedBy列,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我创建了一个JPA实体,如下所示: @Entity @Table(name = "my_table") public class MyEntity extends AbstractAuditingEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(generator = "custom-uuid&qu
@Entity
@Table(name = "my_table")
public class MyEntity extends AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "custom-uuid")
@GenericGenerator(name = "custom-uuid",
strategy = "generator.CustomUUIDGenerator")
private String id;
@Column(name = "name")
private String name;
@Column(name = "description")
private String description;
@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();
MyEntity如下所示:
@Entity
@Table(name = "my_table")
public class MyEntity extends AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "custom-uuid")
@GenericGenerator(name = "custom-uuid",
strategy = "generator.CustomUUIDGenerator")
private String id;
@Column(name = "name")
private String name;
@Column(name = "description")
private String description;
@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();
摘要审计实体如下所示:
@Entity
@Table(name = "my_table")
public class MyEntity extends AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "custom-uuid")
@GenericGenerator(name = "custom-uuid",
strategy = "generator.CustomUUIDGenerator")
private String id;
@Column(name = "name")
private String name;
@Column(name = "description")
private String description;
@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();
现在,我用以下语句更新DB中的实体:
MyEntity savedEntity = threatCanvasRepository.save(myEntity);
这里,在savedEntity
对象中,lastModifiedBy
设置为null
尽管如此,当我从DB获取相同的数据时,我能够看到lastModifiedBy已设置。我无法理解我在这里错过了什么
编辑
最奇怪的是,我在响应中得到了createdDate和lastModifiedDate,但不是createdBy和lastModifiedBy我假设您的服务是
@Transactional
,然后Repository.save()
实际上并没有立即将其保存到数据库中,它将其添加到当前事务中以供以后处理<代码>@CreatedDate、@CreatedBy
、@LastModifiedBy
和@LastModifiedDate
注释是在JPA实际提交事务时处理的(我假设是Hibernate)。因此,您需要在提交当前事务后从另一个服务获取。但通常情况下,你并不需要它。只要相信它们在DB中。您在应用程序中启用了JPA审核吗
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration
@EnableJpaAuditing
public class JpaAuditingConfiguration {
@Bean
public AuditorAware<String> auditorProvider() {
/*
if you are using spring security, you can get the currently logged username with following code segment.
SecurityContextHolder.getContext().getAuthentication().getName()
*/
return new UsernameAuditorAware();
}
}
import org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.data.domain.AuditorAware;
导入org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@配置
@启用JPA审核
公共类JpaAuditingConfiguration{
@豆子
公共AuditorAware auditorProvider(){
/*
如果您使用的是spring security,则可以使用以下代码段获取当前记录的用户名。
SecurityContextHolder.getContext().getAuthentication().getName()
*/
返回新的用户名AuditorAware();
}
}
这是@LastModifiedBy批注工作所必需的。您是否配置了
AuditingEntityListener
并实现了AuditorAware
?是的,我配置了。最奇怪的是,我得到了createddate和lastModifiedDate,但没有得到createdBy和lastModifiedBy。你能给我们展示一下AuditorAware
的实现吗?是的@Viktar你完全正确。是的,事实上我想要回复中的字段。但我想没有办法让这些场在同一个流中。