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

use*_*468 1 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.
}
Run Code Online (Sandbox Code Playgroud)

以下CrudRepository:

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

}
Run Code Online (Sandbox Code Playgroud)

并进行以下测试:

@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());
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一个条件失败了.更新实体后,不应该是createdDate和lastModifiedDate不同?

谢谢!

小智 8

我遇到了同样的问题,但现在想出了一个解决方法.在@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();
Run Code Online (Sandbox Code Playgroud)