使用JPA数据CrudRepositories自动生成创建日期和最后修改日期

问题描述 投票:0回答:3

我正在尝试迁移我的应用程序以使用实体生成架构,而不是使用预先存在的架构。到目前为止,创建和最后修改日期由数据库(MySql)更新,但现在由于我想从 JPA 生成架构,我必须以编程方式执行此操作。

以前,我总是使用 @PrePersit 和 @PreUpdate 来执行此操作,没有任何问题,但现在它不起作用,我认为这是因为我为我的 DAO 使用 spring data 的 CrudRepository 接口,所以我不知道发生了什么实体经理在这里...

我做了一些研究,发现了一些关于春季审核的信息,但我无法让它发挥作用。目前我正在尝试 @Created 和 @LastModified 注释,但它们不起作用。这就是我现在所拥有的:我的抽象:

@MappedSuperclass
@Data
@ToString
@EqualsAndHashCode
public abstract class AbstractEntity implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@SequenceGenerator(name = "seq")
@Column(name = "ID")
private Long id = 0L;

@CreatedDate
// @Generated(GenerationTime.INSERT)
@Column(name = "CREATED", insertable = true, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date created;

@LastModifiedDate
@Version
// @Generated(GenerationTime.ALWAYS)
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "LAST_MODIFIED", insertable = false, updatable = true)
private Date lastModified;

/**
 * copies the auto generated fields id, created and last modified form the given entity/DTO to this entity/DTO
 * 
 * @param copyEntity the entity to copy from.
 */
public void copy(AbstractEntity copyEntity) {
    this.setId(copyEntity.getId());
    this.setCreated(copyEntity.getCreated());
    this.setLastModified(copyEntity.getLastModified());
}

}

我的配置:

@Configuration
@ActiveProfiles("development")
@EnableTransactionManagement
@EnableJpaRepositories
@EnableJpaAuditing(setDates = false, auditorAwareRef = "auditorAware")
public class RepositoryTestContext {

    @Bean
    public AuditorAware<String> auditorAware() {
        return new AuditorAware<String>() {

            @Override
            public String getCurrentAuditor() {
                return "dummy";
            }
        };
    }
}

基本上我的测试表明创建日期和上次修改日期没有更新。有什么想法吗???

spring hibernate jpa auditing
3个回答
4
投票

我认为您在 AbstractEntity 上缺少 @EntityListeners 注释:

@EntityListeners({AuditingEntityListener.class})
@MappedSuperclass
@Data
@ToString
@EqualsAndHashCode
public abstract class AbstractEntity implements Serializable {

1
投票

我认为你已经在这一行中设置了它:

@EnableJpaAuditing(**setDates = false**, auditorAwareRef = "auditorAware")

这是来自 Spring 文档,常见问题

问题:我想使用 Spring Data JPA 审核功能,但我的数据库已设置为设置实体的修改和创建日期。如何防止 Spring Data 以编程方式设置日期。

答案:只需将审计命名空间元素的 set-dates 属性设置为 false 即可。


0
投票

我认为这些注释是 Hibernate 5.2+++

我认为您可能正在使用 Hibernate 5.0.x 或更低版本。

如果没有看到你的 POM,我无法确定。只需确保您当前的版本支持 hibernate.annotations 中的此注释即可。

© www.soinside.com 2019 - 2024. All rights reserved.