Entity State Detection Strategies

  • @Id-Property 检查(默认):如果实体的 ID 属性为 null 或 0(对于基本类型),则实体被认为是新的。

  • @Version-Property 检查:如果带有 @Version 注释的属性存在且为 null,或者对于基本类型的版本属性为 0,则实体被认为是新的。

  • 实现 Persistable:如果实体实现了 Persistable,Spring Data 将委托新检测到实体的 isNew(…​) 方法。

  • 提供自定义 EntityInformation 实现:通过创建模块特定存储库工厂的子类并覆盖 getEntityInformation(…​) 方法,可以自定义存储库基本实现中使用的 EntityInformation 抽象。

下表描述了 Spring Data 提供的策略,用于检测实体是否新创建:

The following table describes the strategies that Spring Data offers for detecting whether an entity is new:

Table 1. Options for detection whether an entity is new in Spring Data

@Id-Property inspection (the default)

By default, Spring Data inspects the identifier property of the given entity. If the identifier property is null or 0 in case of primitive types, then the entity is assumed to be new. Otherwise, it is assumed to not be new.

@Version-Property inspection

If a property annotated with @Version is present and null, or in case of a version property of primitive type 0 the entity is considered new. If the version property is present but has a different value, the entity is considered to not be new. If no version property is present Spring Data falls back to inspection of the identifier property.

Implementing Persistable

If an entity implements Persistable, Spring Data delegates the new detection to the isNew(…) method of the entity. See the Javadoc for details.

Note: Properties of Persistable will get detected and persisted if you use AccessType.PROPERTY. To avoid that, use @Transient.

Providing a custom EntityInformation implementation

You can customize the EntityInformation abstraction used in the repository base implementation by creating a subclass of the module specific repository factory and overriding the getEntityInformation(…) method. You then have to register the custom implementation of module specific repository factory as a Spring bean. Note that this should rarely be necessary.