此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data JPA 3.4.0! |
持久化实体
本节介绍如何使用 Spring Data JPA 持久保存(保存)实体。
保存实体
可以使用CrudRepository.save(…)
方法。它使用底层 JPA 保留或合并给定的实体EntityManager
.如果尚未持久化实体,则 Spring Data JPA 会通过调用entityManager.persist(…)
方法。否则,它会调用entityManager.merge(…)
方法。
实体状态检测策略
Spring Data JPA 提供了以下策略来检测实体是否为新实体:
-
Version-Property 和 Id-Property 检查(默认): 默认情况下, Spring Data JPA 首先检查是否存在非原始类型的 Version 属性。 如果有,则如果该属性的值为
null
. 如果没有这样的版本属性, Spring Data JPA 会检查给定实体的标识符属性。 如果 identifier 属性为null
,则假定该实体为新实体。 否则,将假定它不是新的。 -
实施
Persistable
:如果实体实现Persistable
,Spring Data JPA 将新的检测委托给isNew(…)
实体的方法。有关详细信息,请参阅 JavaDoc。 -
实施
EntityInformation
:您可以自定义EntityInformation
abstraction (抽象)SimpleJpaRepository
通过创建JpaRepositoryFactory
并覆盖getEntityInformation(…)
方法。然后,您必须注册JpaRepositoryFactory
作为 Spring bean 进行。请注意,这应该很少是必要的。有关详细信息,请参阅 JavaDoc。
选项 1 不是使用手动分配的标识符且没有 version 属性的实体的选项,因为标识符将始终为非null
.
该场景中的常见模式是使用带有 transient 标志 default 的公共基类来指示新实例,并使用 JPA 生命周期回调在持久性作上翻转该标志:
@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 | 在Persistable.isNew() 以便 Spring Data 存储库知道是否调用EntityManager.persist() 或….merge() . |
3 | 使用 JPA 实体回调声明方法,以便在存储库调用save(…) 或由持久化提供程序创建的实例。 |