java - Spring-Data-Jpa AuditingEntityListener createdDate 在保存现有实体时更新

标签 java spring hibernate jpa spring-data-jpa

我有以下 JPA 实体:

@EntityListeners(AuditingEntityListener.class)
@Entity
public class EntityWithAuditingDates {

    @Id
    @GeneratedValue
    private Long id;

    @Temporal(TemporalType.TIMESTAMP)
    @CreatedDate
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    @LastModifiedDate
    private Date lastModified;

    private String property;

    // getters and setters omitted.
}

以及以下 CrudRepository:

@Service
public interface EntityWithAuditingDatesRepository extends CrudRepository<EntityWithAuditingDates, Long> {

}

以及以下测试:

@SpringApplicationConfiguration(classes = FooApp.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class AuditingEntityListenerTest {

    @Autowired
    private EntityWithAuditingDatesRepository entityWithAuditingDatesRepository;

    @Test
    public void test() {
        EntityWithAuditingDates entityWithAuditingDates = new EntityWithAuditingDates();
        entityWithAuditingDates.setProperty("foo");
        assertNull(entityWithAuditingDates.getCreatedDate());
        assertNull(entityWithAuditingDates.getLastModified());
        entityWithAuditingDatesRepository.save(entityWithAuditingDates);
        assertNotNull(entityWithAuditingDates.getCreatedDate());
        assertNotNull(entityWithAuditingDates.getLastModified());
        assertEquals(entityWithAuditingDates.getLastModified(), entityWithAuditingDates.getCreatedDate());
        entityWithAuditingDates.setProperty("foooo");
        entityWithAuditingDatesRepository.save(entityWithAuditingDates);
        assertNotEquals(entityWithAuditingDates.getCreatedDate(), entityWithAuditingDates.getLastModified());
    }
}

最后一个条件不成立。更新实体后 createdDate 和 lastModifiedDate 不应该不同吗?

谢谢!

最佳答案

我遇到了同样的问题,但现在找到了解决方法。在@Column 上,我设置了 updatable=false 以在更新时排除 create* 字段。

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

  @CreatedDate
  @NotNull
  @Column(name = "created_date", nullable = false, updatable = false)
  private ZonedDateTime createdDate = ZonedDateTime.now();

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

  @LastModifiedDate
  @Column(name = "last_modified_date")
  private ZonedDateTime lastModifiedDate = ZonedDateTime.now();

关于java - Spring-Data-Jpa AuditingEntityListener createdDate 在保存现有实体时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33500860/

相关文章:

java - 在另一个 EJB 中调用一个 EJB 是否健康?

java - JRE 7 JVM 更新和优化

java - 将第三个按钮添加到警报对话框会使应用程序崩溃

java - 基于 Spring mvc 注解的 Controller RequestMappingHandlerMapping 有什么问题?

java - Spring MVC - 没有绑定(bind)到线程的 Hibernate session

java - 无法在 Spring 3.2.8 和 junit 4.4 中 Autowiring 现场执行 Junit 测试

java - 如何加载持久的 Hibernate 实体进行绑定(bind),以便非表单属性不会丢失?

java - Spring Boot通过 JDBC 语句执行 DDL 删除架构时出错

java - 警告 - 类是原始类型。对泛型类型 Class<T> 的引用应该参数化

java - Maven - 覆盖测试资源文件夹