是否有一种较少冗余的方式来加载/保存实体?

Posted

技术标签:

【中文标题】是否有一种较少冗余的方式来加载/保存实体?【英文标题】:Is there a less redundant way to load/save an entity? 【发布时间】:2019-06-17 15:14:50 【问题描述】:

目前,我们的项目中有很多这种模式。加载实体并在之后保存它是一项非常常见的任务。 Kotlin 中是否有更简洁、更少冗余的方式?

userRepository.findByIdOrNull(1L)?.let 
    userRepository.save(it.apply 
        firstName = "Jon"
        lastName = "Doe"
    )
 ?: throw NoSuchElementException("User not found")

【问题讨论】:

【参考方案1】:

据我所知,没有官方方法可以让它更简洁,但你可以像这样在JpaRepository 上创建一个扩展函数:

inline fun <reified T : Any, ID : Serializable> JpaRepository<T, ID>.update(id: ID, modify: T.() -> Unit) = findByIdOrNull(id)?.let 
    modify(it)
    saveAndFlush(it)
 ?: throw NoSuchElementException("There is no $T::class.simpleName with id $id!")

并像这样使用它:

userRepository.update(1L) 
    firstName = "Jon"
    lastName = "Doe"

这将使呼叫站点真正干净简洁。

update 当然可以返回null 而不是抛出异常。这取决于您的用例。


如果您想知道为什么我会立即提出并回答这个问题,请查看here。

【讨论】:

以上是关于是否有一种较少冗余的方式来加载/保存实体?的主要内容,如果未能解决你的问题,请参考以下文章

Android应用实现开机自启动的一种较好的方式

是否有一种“正确”的方式来读取 CSV 文件 [重复]

是否有一种“正确”的方式来读取 CSV 文件 [重复]

是否有一种可移植的方式来定义 INT_MAX?

是否有一种 Pythonic 方式来创建克隆项目列表? [复制]

是否有一种非阻塞方式来检查 asyncio 子进程是否处于活动状态?