如何在 Kotlin 中优雅地将实体转换为 DTO?

问题描述

我正在研究 Kotlin + SpringBoot 网络服务,我想以最方便的方式将 DTO 转换为实体。

实体:

@Entity
data class Shop(
   @Id
   @GeneratedValue
   val id: Long,val name: String
   @OnetoOne
   val owner: User,...
)

@Entity
data class User(
   @Id
   @GeneratedValue
   val id: Long,val name: String,...
)

DTO:

data class ShopDTO(
   val id: Long,val ownerId: Long,val ownerName: String,...
)

因此,当有人想要创建一个新商店时,我的服务会获取一个 ShopDTO(name,ownerId) 作为请求正文,然后我需要将其转换为 Shop 对象才能将其保存到数据库中。现在这是我的映射器函数的样子:

fun fromDTO(source: ShopDTO) = Shop(
   id = source.id,name = source.name,owner = ???,...
)

为了能够与所有者一起存储商店,我只需要一个 ID。使用给定的 ownerId 创建一个新用户就足够了。 为此,我尝试了以下解决方案:

  • 为 User 类中的字段添加认值。
  • 使字段可以为空。
  • 添加二级构造函数。这也需要认值。
  • 使用一些反射魔法创建一个空对象,然后设置 id。
  • 使用给定的 id 在 UserRepository 上调用 findById 方法

我想保留实体的非空、不可变字段,不想使用反射。也不想运行不必要的选择数据库查询只是为了通过 id 取回用户

你能建议我其他选择吗?你会如何处理这种情况? Kotlin 有没有什么好的mapper 框架可以解决这个问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)