更新日志/SDK 0.7.8
更新日志
说明 0.7.8-RELEASE 引入的 repository 与 trait 拆分迁移步骤。
提示: 如果你的项目没有使用 ApiHug 的领域实体管理能力,这次迁移对你的影响通常会比较有限。
0.7.8-RELEASE 主要引入了两个 repository 相关变化:
@Derived 的维护位置拆分到独立的 trait 目录lite 成为 stub 侧的默认模型
迁移目标:
下面以模块 book-app 中已有的 repository com.novel.book.wire.domain.book.repository.BookAuthorRepository 为例。
当前位置: book-app\src\main\stub\com\novel\book\wire\domain\book\repository\BookAuthorRepository
@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 版本:
[versions]
# libraries
apihug = "0.7.8-RELEASE"
然后执行模块对应的 stub 命令。具体命令通常可以在项目的 README.md 中找到:
./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。
@Derived 方法移动到 trait 目录中的 _BookAuthorRepository。stub 命令。之后,所有 @Derived repository 方法都会维护在 book-app\src\main\trait 下。
stub 任务会把这些方法重新合并回运行时的 BookAuthorRepository。BookAuthorRepository 会更干净。这条迁移路径需要更多手工操作,但对 repository 数量不多的项目仍然可行。
book-app\src\main\traitt.com.novel.book.wire.domain.book.repository,即在原包名前加 t._BookAuthorRepository,即在原 BookAuthorRepository 前加 _extends BookAuthorRepositoryBookAuthorRepository 中的 @Derived 方法复制到 _BookAuthorRepositorystub 命令如果 repository 数量可控,例如少于 30 个,这种方式仍然是可以接受的。
项目目录结构
+---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:
/**
* 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:
@Overwrite
default void myDaoApi() {
}
记得给这个方法加上 @Overwrite。随后 IDEA 会提示你执行 Pull method 'myDaoApi' to 'JobEntityRepository'。
按 IDEA 的建议操作后,方法会被提升到父接口里,从而减少一次额外的 stub 运行。
下一次执行 stub 后,这套逻辑仍然会被保留下来。
可以把 _BookAuthorRepository 理解为 BookAuthorRepository 的 companion interface。
ApiHug 工具链会帮你处理这套合并流程。
也可以参考 Scala 中的 Companion objects。
如果升级过程中遇到问题,请联系 ApiHug 团队:
