
0.7.8-RELEASE 重大更新和迁移步骤
💁 如果你尚未使用 ApiHug 领域实体对象管理(ORM), 那么这次升级暂不会影响你,但最好和官方保持最新统一版本! :-)
0.7.8-RELEASE 添加功能:
Repository 扩展, 迁移到独立的 trait 目录管理, 使代码结构更简单清晰;lite 模式作为 stub 默认编译模式,将使他更迅捷;
目的:
repository 更直接简单.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:
@Repository
@SuppressWarnings("Duplicates")
public interface BookAuthorRepository
extends HopeJdbc<BookAuthor>,
BookJdbcSupport,
BookAuthorDSL,
ListCrudRepository<BookAuthor, Long> {
@Derived
@Query
Optional<BookAuthor> findByName(final String name);
//Other method
}
⚠️⚠️⚠️ 首先保证你的 @Derived 已经备份, 在你跑 stub 命令前;(如果版本管理,先commit为妙)
因为升级后的 stub 只保留纯 generated代码, 也就是stub 命令后,任何stub目录下手动代码都将被清除.
跑下本模块的 stub 命令, 首先保证你SDK 版本已经被更新到 0.7.8-RELEASE+, gradle\libs.versions.toml:
[versions]
# libraries
apihug = "0.7.8-RELEASE"
命令行可以到你项目的 README.md 找到:
./gradlew.bat book-app:clean stub build -x test -x stubTest
跑完后你会看到一个新的 sourceSet: book-app\src\main\trait;
💁♀️ 你可能需要到你的 gradle tool window 触发本项目的 Reload Gradle Project ,否则可能提醒 book-app\src\main\trait 不能被当做 sourceSet!
@Derived copy 回到 _BookAuthorRepository(trait 目录下) & BookAuthorRepository(stub 目录)(只有第一次迁移需要,以后只需要在 _BookAuthorRepository 编写);stub 命令.从今往后, 所有Repository扩展 @Derived 方法, 都在独立 book-app\src\main\trait 目录维护:
stub 命令将你需要融入(trait)的方法(也就是老的@Derived方法)合进到运行时的 BookAuthorRepository 类BookAuthorRepository 在持续开发中模板和扩展逻辑冲突,保持他的简单和直观.另外一种迁移方式, 更多手动工作,但是更清晰;
book-app\src\main\traitt.com.novel.book.wire.domain.book.repository: 原包com.novel.book.wire.domain.book.repository加个前缀 t.;interface _BookAuthorRepository :原接口 BookAuthorRepository前缀 _ (下划线);extends BookAuthorRepository (方便编辑器提示)BookAuthorRepository 里所有 @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, 引入一种更好控制 Repository 扩展方法的方式;
当在 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 接口:
@Overwrite
default void myDaoApi(){
}
记得添加 @Overwrite , IDEA 编辑器将提醒你 Pull method 'myDaoApi' to 'JobEntityRepository'
按照提示执行,方法将被提升到父接口里面, 采用这个技巧可以避免多跑一次 stub 命令;
下次当执行 stub 命令时候, 逻辑和代码还是一致的.
你可以把 _BookAuthorRepository 想象成 BookAuthorRepository的伴生类(虽然有继承关系:方便获得编辑器提示) ;
只是 ApiHug 工具链完全帮你处理掉了过程的复杂性!
参考Scala 伴生对象 Companion objects;
如果你过程中遇到任何问题,请垂询我们:
