本节介绍如何使用 Spring Data JPA 保存(保存)实体。
保存实体
可以使用该方法执行保存实体。它使用底层 JPA 来保留或合并给定的实体。如果实体尚未被持久化,Spring Data JPA 会通过调用该方法来保存该实体。否则,它将调用该方法。CrudRepository.save(…)
EntityManager
entityManager.persist(…)
entityManager.merge(…)
实体状态检测策略
Spring Data JPA 提供了以下策略来检测实体是否为新实体:
-
Version-Property 和 Id-Property 检查(默认): 默认情况下,Spring Data JPA 首先检查是否存在非基元类型的 Version-property。 如果存在,则如果该属性的值为 ,则该实体被视为新实体。 如果没有这样的 Version-property Spring Data JPA 将检查给定实体的标识符属性。 如果标识符属性为 ,则假定该实体是新的。 否则,假定它不是新的。
null
null
-
实现:如果实体实现,Spring Data JPA会将新的检测委托给实体的方法。有关详细信息,请参见 JavaDoc。
Persistable
Persistable
isNew(…)
-
实现 :您可以通过创建 的子类并相应地覆盖该方法来自定义实现中使用的抽象。然后,您必须将自定义实现注册为 Spring Bean。请注意,这应该很少是必要的。有关详细信息,请参见 JavaDoc。
EntityInformation
EntityInformation
SimpleJpaRepository
JpaRepositoryFactory
getEntityInformation(…)
JpaRepositoryFactory
选项 1 不适用于使用手动分配的标识符且没有版本属性的实体,因为这些实体的标识符将始终为非 。
该方案中的一种常见模式是使用具有默认暂时性标志的公共基类来指示新实例,并使用 JPA 生命周期回调在持久性操作时翻转该标志:null
@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 | 声明一个标志来保存新状态。暂时性,以便它不会持久化到数据库。 |
2 | 在实现中返回标志,以便 Spring Data 存储库知道是调用还是 .Persistable.isNew() EntityManager.persist() ….merge() |
3 | 使用 JPA 实体回调声明方法,以便在持久性提供程序调用存储库或创建实例后切换标志以指示现有实体。save(…) |
1 | 声明一个标志来保存新状态。暂时性,以便它不会持久化到数据库。 |
2 | 在实现中返回标志,以便 Spring Data 存储库知道是调用还是 .Persistable.isNew() EntityManager.persist() ….merge() |
3 | 使用 JPA 实体回调声明方法,以便在持久性提供程序调用存储库或创建实例后切换标志以指示现有实体。save(…) |