我正在尝试迁移我的应用以使用实体生成架构,而不是使用预先存在的架构。到目前为止,create和lastModify日期由DB(MySql)更新,但是现在因为我想从JPA生成模式,所以我必须以编程方式执行此操作。
之前,我总是使用@PrePersit和@PreUpdate来做这个没有任何问题,但现在它不起作用我认为这是因为我使用Spring数据的CrudRepository接口为我的DAO,所以我不知道发生了什么与实体经理在这里......
我做了一些研究,我发现了一些关于弹簧审核的事情,但我无法让它发挥作用。目前我正在尝试@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";
}
};
}
}
基本上我的测试表明创建日期和上次修改日期没有更新。任何想法???
答案 0 :(得分:4)
我认为你错过了AbstractEntity上的@EntityListeners注释:
@EntityListeners({AuditingEntityListener.class})
@MappedSuperclass
@Data
@ToString
@EqualsAndHashCode
public abstract class AbstractEntity implements Serializable {
答案 1 :(得分:0)
我认为那些注释是Hibernate 5.2 +++
我想也许您正在使用Hibernate 5.0.x或更低版本。
虽然没有看到你的POM,但我无法确定。只需确保您当前的版本支持hibernate.annotations中的此注释。
答案 2 :(得分:0)
我认为你已经在这一行中设置了它: @EnableJpaAuditing( setDates = false ,auditorAwareRef =“auditorAware”)
这是来自Spring docs,常见问题:
问题:我想使用Spring Data JPA审核功能,但我的数据库已设置为在实体上设置修改和创建日期。如何防止Spring Data以编程方式设置日期。
答案:只需使用审计命名空间元素的set-dates属性为false。