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

Rad*_*Rad 5 kotlin

假设我们有一个 JPA 实体:

@Entity
internal class FooJpaEntity (
  @Id var id: UUID,
  @Column var foo: String, // Never null in DB
)
Run Code Online (Sandbox Code Playgroud)

现在我们想通过将其包装在另一个类中来隐藏它:

class FooWrapper internal constructor(internal val entity: FooJpaEntity) {
  val id: UUID by Delegate(entity::id)
  val foo: String by Delegate(entity:foo)
}
Run Code Online (Sandbox Code Playgroud)

并且Delegate是:

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) }
}
Run Code Online (Sandbox Code Playgroud)

上面仅支持从数据库读取(因为没有人可以访问构造函数)。我们需要另一个构造函数来支持创建新对象以持久保存到数据库中:

class FooWrapper ... {
  constructor(id: UUID, foo: String): this(FooJpaEntity(id, foo))
  // delegated properties
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以创建、编辑、保留和读取实体。
还有一个要求:我需要进行一些清理foo(比如说修剪它,但实际上它更复杂):

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() }
}
Run Code Online (Sandbox Code Playgroud)

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

在 Kotlin 中实现上述目标的惯用方法是什么(不仅仅是一些辅助方法)?
另外,如果对上述代码有任何其他评论(关于 JPA、实体等),我很乐意学习。谢谢。