JPA、Spring数据和Kotlin-保存记录
历史上,我曾在Kotlin手动访问数据,并有一个我一直使用的特定数据结构:JPA、Spring数据和Kotlin-保存记录,jpa,spring-data-jpa,kotlin,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 ) 接口Id{ val id:Int } 数据类标识( id:
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
)
接口Id{
val id:Int
}
数据类标识(
id:id,
版本:Int
)
数据类模型(
身份:身份,
数据:数据
)
通过这样做,我可以得到如下DAO:
fun getUserById(id: UserId) : Model<UserId, UserData>()
fun createUser(user: UserData) : Model<UserId, UserData>()
fun getUserById(id:UserId):Model()
fun createUser(用户:UserData):Model()
这通常工作得很好,但这意味着编写和测试DAO更加耗时
对于一个即将到来的项目,我正在考虑使用SpringDataJPA来完成它——这样我就可以将我的模型作为JPA实体来编写,并让SpringData完成所有实际使用它们的繁重工作
问题是——我无法找到一种处理上述数据的简单方法。到目前为止,我所能看到的最好的情况是:
- 实体将ID存储为本机类型,并使用手动getter将其转换为富类型
- 采用富类型并委托给具有本机类型的版本的默认接口方法
- 具有可空ID和版本列的实体对象,这意味着在读回它们时,我总是要对它们进行空检查
@实体
@表(name=“users”)
数据类用户(
@身份证
@列(name=“user\u id”)
@GeneratedValue(策略=GenerationType.SEQUENCE)
private val rawId:Int?=null,
@版本
val版本:Int?=null,
val name:String,
val电子邮件:String,
val已启用:布尔值
) {
valid:UserId?
get()=rawId?.let{UserId(it)}
}
接口用户存储库:CrudRepository{
fun findOne(id:UserId)=findOne(id.id)
}
我能应付的前两个问题——这是一种痛苦,但离世界末日还很远。第三个问题更令人担忧,因为它使我处于这样一种情况:我知道这些值永远不能为null,但我仍然需要在每次访问它们中的任何一个时都将它们视为null
有没有什么方法可以设置JPA和Spring数据,让这种设置正常工作
干杯
@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)
}