更新日志/SDK 0.7.8

更新日志

SDK 0.7.8-RELEASE Repository 迁移

说明 0.7.8-RELEASE 引入的 repository 与 trait 拆分迁移步骤。

English | 简体中文

提示: 如果你的项目没有使用 ApiHug 的领域实体管理能力,这次迁移对你的影响通常会比较有限。

Latest: Maven Central version badge for com.apihug/it-bom

0.7.8-RELEASE 主要引入了两个 repository 相关变化:

  • 将 Repository @Derived 的维护位置拆分到独立的 trait 目录
  • lite 成为 stub 侧的默认模型
domain design

Repository 迁移

迁移目标:

  1. 让生成出来的 repository 保持干净、可预测。
  2. 把派生 repository 逻辑迁移到更容易维护的位置。

下面以模块 book-app 中已有的 repository com.novel.book.wire.domain.book.repository.BookAuthorRepository 为例。

当前位置: book-app\src\main\stub\com\novel\book\wire\domain\book\repository\BookAuthorRepository

Java
@Repository
@SuppressWarnings("Duplicates")
public interface BookAuthorRepository
    extends HopeJdbc<BookAuthor>,
        BookJdbcSupport,
        BookAuthorDSL,
        ListCrudRepository<BookAuthor, Long> {

  @Derived
  @Query
  Optional<BookAuthor> findByName(final String name);

  // Other methods
}

重要: 在执行 stub 命令前,请先备份你的 @Derived 方法。

这次调整之后,stub 目录会被视为纯生成代码,因此下一次执行 stub 时可能会被整体覆盖。

第一步

先在 gradle\libs.versions.toml 中升级 SDK 版本:

Toml
[versions]
# libraries
apihug = "0.7.8-RELEASE"

然后执行模块对应的 stub 命令。具体命令通常可以在项目的 README.md 中找到:

Terminal
./gradlew.bat book-app:clean stub build -x test -x stubTest

命令执行成功后,你会看到一个新的 source set:book-app\src\main\trait

提示: 你可能需要在 Gradle 工具窗口中执行 Reload Gradle Project。否则,book-app\src\main\trait 可能不会被识别为 source set。

第二步

  1. 把备份下来的 @Derived 方法移动到 trait 目录中的 _BookAuthorRepository
  2. 在首次迁移阶段,暂时保持旧 repository 仍然可以通过编译。
  3. 再次执行 stub 命令。

之后,所有 @Derived repository 方法都会维护在 book-app\src\main\trait 下。

  1. stub 任务会把这些方法重新合并回运行时的 BookAuthorRepository
  2. 生成模板代码和自定义派生逻辑分离后,BookAuthorRepository 会更干净。
  3. 以 SQL 为主的 trait 逻辑也更容易长期维护。

手工迁移路径

这条迁移路径需要更多手工操作,但对 repository 数量不多的项目仍然可行。

  1. 创建目录 book-app\src\main\trait
  2. 创建包 t.com.novel.book.wire.domain.book.repository,即在原包名前加 t.
  3. 创建 trait 接口 _BookAuthorRepository,即在原 BookAuthorRepository 前加 _
  4. 让它 extends BookAuthorRepository
  5. BookAuthorRepository 中的 @Derived 方法复制到 _BookAuthorRepository
  6. 运行 stub 命令

如果 repository 数量可控,例如少于 30 个,这种方式仍然是可以接受的。

项目目录结构

Terminal
+---java
|   \---com
|       \---novel
|           \---book
+---stub
|   \---com
|       \---novel
|           \---book
|               \---wire
|                   \---domain
|                       +---account
|                       |   +---dsl
|                       |   \---repository
|                       +---book
|                       |   +---dsl
|                       |   \---repository
|                       \---job
|                           +---dsl
|                           \---repository
\---trait
    \---t
        \---com
            \---novel
                \---book
                    \---wire
                        \---domain
                            +---account
                            |   \---repository
                            +---book
                            |   \---repository
                            \---job
                                \---repository

后续改进

从 SDK 0.8.5-RELEASE 开始,后续版本对这套模式做了更容易维护的改进。

当你在 proto 中定义实体并运行 stub 后,也会得到一个空的 trait repository:

Java
/**
 * NEVER try to use this class directly, keep it as an interface(default, no public), all body of
 * this interface will be merger to {@link JobEntityRepository} after {@code stub };
 *
 * <p>NEVER try to Overwrite parent {@link JobEntityRepository } or {@link
 * org.springframework.data.repository.ListCrudRepository} 's default method!!
 *
 * @see JobEntityRepository
 * @see com.novel.book.wire.domain.job.JobEntity
 */
interface _JobEntityRepository extends JobEntityRepository {

  /** Please put your customized SQL here, any SQL other place will be dropped after merger! */
  interface _DerivedSQL {}
}

然后你可以继续补充自定义 DAO API:

Java
@Overwrite
default void myDaoApi() {

}

记得给这个方法加上 @Overwrite。随后 IDEA 会提示你执行 Pull method 'myDaoApi' to 'JobEntityRepository'

按 IDEA 的建议操作后,方法会被提升到父接口里,从而减少一次额外的 stub 运行。

下一次执行 stub 后,这套逻辑仍然会被保留下来。

最佳提示

可以把 _BookAuthorRepository 理解为 BookAuthorRepository 的 companion interface。

ApiHug 工具链会帮你处理这套合并流程。

也可以参考 Scala 中的 Companion objects

如果升级过程中遇到问题,请联系 ApiHug 团队:

Apihug Contact QR Code
Copyright © 2026 ApiHug·AI-native Enterprise Architecture Factory