如何将属性委托给Kotlin中的JPA实体

如何将属性委托给Kotlin中的JPA实体,kotlin,Kotlin,假设我们有一个JPA实体: @Entity internal class FooJpaEntity ( @Id var id: UUID, @Column var foo: String, // Never null in DB ) 现在,我们希望通过将其包装到另一个类中来隐藏它: class FooWrapper internal constructor(internal val entity: FooJpaEntity) { val id: UUID by Delegate(e

假设我们有一个JPA实体:

@Entity
internal class FooJpaEntity (
  @Id var id: UUID,
  @Column var foo: String, // Never null in DB
)
现在,我们希望通过将其包装到另一个类中来隐藏它:

class FooWrapper internal constructor(internal val entity: FooJpaEntity) {
  val id: UUID by Delegate(entity::id)
  val foo: String by Delegate(entity:foo)
}
代表
是:

class Delegate<T>(private val delegate: KMutableProperty0<T>) {
  operator fun getValue(thisRef: Any?, property: KProperty<*>): T = delegate.get()
  operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { delegate.set(value) }
}
现在我们可以创建、编辑、保存和读取实体。
还有一个要求:我需要对
foo
进行一些清理(比如说修剪它,实际上它更复杂):

我对上述内容有两个问题:
1.我失去了授权。可能这是不可避免的,因为我不想把逻辑放在实体中,对吗?
2.清理逻辑也需要在构造函数中复制

在Kotlin中实现上述目标的惯用方法是什么(不仅仅是一些辅助方法)?

此外,如果对上述代码有任何其他评论(关于JPA、实体等),我很乐意了解。谢谢。

我不确定我是否理解您想要实现的目标。你说“现在我们想对公众隐瞒”是什么意思?使用
internal
修饰符,您已经使它仅在定义它的模块内可见。我想要的是通过包装器处理持久层和实体,而不是直接处理。这有意义吗?谢谢,我想我现在明白了。我的想法再好不过了。为什么不想在实体中加入逻辑?Imho这是放置逻辑的正确位置,因为它是其他开发人员会寻找的最直观的位置。这也是DDD方法的实现方式。
class FooWrapper ... {
  constructor(id: UUID, foo: String): this(FooJpaEntity(id, foo))
  // delegated properties
}
class FooWrapper internal constructor(internal val entity: FooJpaEntity) {
  constructor(id: UUID, foo: String): this(FooJpaEntity(id, foo))
  val id: UUID by Delegate(entity::id)
  val foo: String
    get() = entity.foo
    set(value) { entity.foo = value.trim() }
}