从历史上看,我已经在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完成与实际工作相关的所有繁重工作。
问题是 - 我无法找到一种简单的方法来处理上面的数据。到目前为止,我能够看到的最好的是:
基本上是这样的:(注意 - 这是未经测试的)
@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以允许我让这种设置正常工作?
干杯