【新】ApiHug官方文档-ApiHug Spring Data 如何优雅处理自定义主键?

前提

使用 spring data 无疑让数据库处理非常便捷和优雅,但你也必须遵循他的使用规则,所有的对象必须有一个唯一键, 最好的方式就是使用数据库自增长键, Spring Data Repository 可以根据这个键和对象关系进行 CRUD, 但是我们可能遇到有些情况使用业务内定义的 key, 这个key 在业务系统计算好了的, 那么难题来了, spring data 如何判断这个实体,到底是新的(inert) 还是旧的(update)?

ApiHug Spring Data Extensionhttps://apihug.github.io/zhCN-docs/framework/spring-data#-1

实体持久化状态

下表描述了 Spring Data 提供的用于判断实体是否为新实体的策略:

策略说明
@Id 属性检查(默认方式)默认情况下,Spring Data 会检查给定实体的标识符属性。如果该标识符属性为 null,或对于基本类型为 0,则认为该实体是新的。否则,认为该实体不是新的。
@Version 属性检查如果存在使用 @Version 注解的属性且其值为 null,或者对于基本类型的版本属性其值为 0,则认为该实体是新的。如果版本属性存在但具有其他值,则认为该实体不是新的。如果不存在版本属性,Spring Data 将回退到检查标识符属性。
实现 Persistable 接口如果实体实现了 Persistable 接口,Spring Data 会将新实体的判断委托给实体的 isNew(...) 方法。详情请参见 Javadoc注意:如果使用 AccessType.PROPERTYPersistable 的属性可能会被检测并持久化。为避免此情况,请使用 @Transient 注解。
提供自定义的 EntityInformation 实现您可以通过创建特定模块仓库工厂的子类并重写 getEntityInformation(...) 方法,来定制仓库基础实现中使用的 EntityInformation 抽象。然后需要将该自定义的模块特定仓库工厂实现注册为 Spring Bean。请注意,这种情况很少需要。

在 ApiHug 中,有两种方式可以使实体具备可识别性(ID):

  1. 使用 wires: [ALL] 或 wires: [IDENTIFIABLE] 配置。
  2. 通过将单个列标记为 id: true(每个表仅允许一个这样的列)来定义自定义 ID 列。

您可以选择其中一种方式,但不能同时使用两种,以将实体标识为可识别的,从而确保仓库能够正确处理 CRUD 操作。

当使用自定义 ID 列时(例如,使用用户 ID 作为主键),我们如何判断该实体是否为新实体?

默认情况下,如果一个新的实体实例包含 ID,仓库会将其视为 更新 操作,这将导致无法插入新记录。为解决此问题,从 1.4.4-RELEASE 版本开始,ApiHug 通过集成 Spring Data 的 Persistable 接口,提供了对新实体检测的内置支持。

ApiHug 会自动为您的实体注入辅助逻辑以支持此行为:

import org.springframework.data.annotation.Transient;
import org.springframework.data.domain.Persistable;

public final class YourEntity implements Persistable<String> {
    
  @Transient
  private transient boolean __isNew;
  
  private String myId;
  
  @Override
  public String getId() {
    return myId;
  }

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

  public YourEntity asNew() {
    __isNew = true;
    return this;
  }
}

由于此类 ID 通常从一开始就由业务逻辑分配,通过 isNew() 方法可以明确控制操作应被视为 插入 还是 更新,从而确保正确的持久化行为。

更多干货https://apihug.github.io/zhCN-docs/framework/spring-data#-1

参考

  1. jOOQ generates Java code from your database and lets you build type safe SQL queries through its fluent API.
  2. mybatis-dynamic-sql About SQL DSL (Domain Specific Language) for Kotlin and Java. Supports rendering for MyBatis or Spring JDBC Templates
  3. querydsl Unified Queries for Java.Querydsl is compact, safe and easy to learn.
  4. Intro to Querydsl
  5. Spring Data Using jOOQ
  6. JPQL
  7. HQL
  8. Spring - Entity State Detection Strategies
  9. Spring JPA - Entity State-detection Strategies
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ApiHug

God Bless U

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值