JPA,Spring Data和Kotlin - 保存记录

时间:2017-09-02 16:23:44

标签: jpa spring-data-jpa 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存储为本机类型,并使用手动getter将其转换为富类型
  • 使用富类型并委派给具有本机类型
  • 的版本的默认接口方法
  • 具有可空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)
}

我可以应对的前两个 - 这是一个痛苦但远离世界末日。其中第三个更令人担忧,因为它让我处于这样一种情况:我知道值永远不会为null但是我仍然需要将它们当作每次访问它们。

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

干杯

0 个答案:

没有答案