JPA,Spring Data和Kotlin – 保存记录

从历史上看,我手动完成了Kotlin中的数据访问,并拥有一个我经常使用的特定数据结构:

interface Id { val id: Int } data class Identity<ID : Id>( id: ID, version: Int ) data class Model<ID : Id, DATA>( identity: Identity<ID>, data: DATA ) 

通过这样做,我可以有DAO看起来像这样:

 fun getUserById(id: UserId) : Model<UserId, UserData>() fun createUser(user: UserData) : Model<UserId, UserData>() 

这一般运行良好,但意味着编写和测试DAO更费时间。

对于即将到来的项目,我正在考虑使用Spring Data JPA来做这件事 – 所以我可以将我的模型写成JPA实体,并让Spring Data完成所有与它们一起工作的繁重工作。

问题是 – 我无法用上面的数据处理一个简单的方法。 目前为止我所能看到的最好的方法是:

  • 实体将ID存储为本地类型,并且手动获取器将其转换为丰富类型
  • 默认的接口方法将丰富的类型和委托使用本机类型的版本
  • 具有可为空ID和版本列的实体对象,这意味着在阅读它们时,我总是要通过空检查。

本质上是这样的:(注 – 这是未经测试)

 @Entity @Table(name = "users") data class User( @Id @Column(name = "user_id") @GeneratedValue(strategy = GenerationType.SEQUENCE) private val rawId: Int? = null, @Version val version: Int? = null, val name: String, val email: String, val enabled: Boolean ) { val id: UserId? get() = rawId?.let { UserId(it) } } interface UserRepository : CrudRepository<User, Int> { fun findOne(id: UserId) = findOne(id.id) } 

前两个我可以应付 – 这是一个痛苦,但远离世界末日。 其中三分之一更令人担忧,因为这让我处于一种情况,我知道价值永远不会是空的,但我仍然需要把它们看作是每次访问其中的任何一个。

有没有办法设置JPA和Spring Data让我有这种设置正常工作?

干杯