对于最新的稳定版本,请使用 Spring Data JPA 3.4.0spring-doc.cn

持久化实体

本节介绍如何使用 Spring Data JPA 持久保存(保存)实体。spring-doc.cn

保存实体

可以使用该方法保存实体。它使用底层 JPA 保留或合并给定实体。如果尚未保留实体,则 Spring Data JPA 会通过调用该方法来保存实体。否则,它将调用该方法。CrudRepository.save(…)EntityManagerentityManager.persist(…)entityManager.merge(…)spring-doc.cn

实体状态检测策略

Spring Data JPA 提供了以下策略来检测实体是否为新实体:spring-doc.cn

  1. Version-Property 和 Id-Property 检查(默认): 默认情况下, Spring Data JPA 首先检查是否存在非原始类型的 Version 属性。 如果有,则如果该属性的值为 . 如果没有这样的版本属性, Spring Data JPA 会检查给定实体的标识符属性。 如果 identifier 属性为 ,则假定该实体是新实体。 否则,将假定它不是新的。nullnullspring-doc.cn

  2. 实施 :如果实体实现,则 Spring Data JPA 会将新检测委托给实体的方法。有关详细信息,请参阅 JavaDocPersistablePersistableisNew(…)spring-doc.cn

  3. Implementing :您可以通过创建 的子类并相应地覆盖 method 来自定义实现中使用的抽象。然后,您必须将 的自定义实现注册为 Spring bean。请注意,这应该很少是必要的。有关详细信息,请参阅 JavaDocEntityInformationEntityInformationSimpleJpaRepositoryJpaRepositoryFactorygetEntityInformation(…)JpaRepositoryFactoryspring-doc.cn

选项 1 不是使用手动分配的标识符且没有 version 属性的实体的选项,因为与那些实体一样,标识符将始终为非。 该场景中的常见模式是使用带有 transient 标志 default 的公共基类来指示新实例,并使用 JPA 生命周期回调在持久性操作上翻转该标志:nullspring-doc.cn

示例 1.具有手动分配标识符的实体的基类
@MappedSuperclass
public abstract class AbstractEntity<ID> implements Persistable<ID> {

  @Transient
  private boolean isNew = true; (1)

  @Override
  public boolean isNew() {
    return isNew; (2)
  }

  @PrePersist (3)
  @PostLoad
  void markNotNew() {
    this.isNew = false;
  }

  // More code…
}
1 声明一个标志来保存新状态。Transient 的 Chronit,以便它不会持久化到数据库中。
2 在实现中返回标志,以便 Spring Data 存储库知道是调用 还是 。Persistable.isNew()EntityManager.persist()….merge()
3 使用 JPA 实体回调声明方法,以便在持久性提供程序调用存储库或创建实例后切换标志以指示现有实体。save(…)