当前位置: 首页 > 知识库问答 >
问题:

如何在Kotlin中对委托属性进行JPA注释?

朱修真
2023-03-14

假设我有一个JPA实体,比如

@Entity
@Table(name = "plasmid_reference")
class PlasmidReference {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Int? = null

    @Column(name = "project_id")
    var projectId: Int? = null

    @Column(name = "plasmid_id")
    var plasmidId: Int? = null
}

现在,我知道对于plasmid_reference联接表中的每一个条目,这些属性都不能为空。(事实上,数据库强制执行此操作。)

@Entity
@Table(name = "plasmid_reference")
class PlasmidReference {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    lateinit var id: Int

    @Column(name = "project_id")
    lateinit var projectId: Int

    @Column(name = "plasmid_id")
    lateinit var plasmidId: Int
}

好吧,让我们使用建议的解决方案,并转换为使用委托。

@Entity
@Table(name = "plasmid_reference")
class PlasmidReference {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id by notNull<Int>()

    @Column(name = "project_id")
    var projectId by notNull<Int>()

    @Column(name = "plasmid_id")
    var plasmidId by notNull<Int>()
}

这仍然不能编译,因为

此批注不适用于目标“带有委托的成员属性”

@Entity
@Table(name = "plasmid_reference")
class PlasmidReference {

    @field:Id
    @field:GeneratedValue(strategy = GenerationType.IDENTITY)
    var id by notNull<Int>()

    @field:Column(name = "project_id")
    var projectId by notNull<Int>()

    @field:Column(name = "plasmid_id")
    var plasmidId by notNull<Int>()
}
@Entity
@Table(name = "plasmid_reference")
class PlasmidReference {

    @delegate:Id
    @delegate:GeneratedValue(strategy = GenerationType.IDENTITY)
    var id by notNull<Int>()

    @delegate:Column(name = "project_id")
    var projectId by notNull<Int>()

    @delegate:Column(name = "plasmid_id")
    var plasmidId by notNull<Int>()
}
The attribute [plasmidId] is not present in the managed type [EntityTypeImpl@960932033:PlasmidReference 
[ javaType: class com.[...].PlasmidReference descriptor: RelationalDescriptor(com.[...].PlasmidReference --> [DatabaseTable(plasmid_reference)]), mappings: 3]].
    at org.eclipse.persistence.internal.jpa.metamodel.ManagedTypeImpl.getAttribute(ManagedTypeImpl.java:151)
    at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:635)

我如何解决这个问题?

共有1个答案

章岳
2023-03-14

将其移动到构造函数定义中应该可以做到这一点

@Entity
@Table(name = "plasmid_reference")
class PlasmidReference(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Int? = null,
    @Column(name = "project_id")
    var projectId: Int,
    @Column(name = "plasmid_id")
    var plasmidId: Int
)
 类似资料:
  • 就我的理解而言,在Kotlin中委托实现的想法是为了避免出现类似于以下内容的代码: 相反,我们可以编写以下代码,该代码也应该执行相同的操作: 现在,我希望是一个可变变量,即我的代码如下所示: 因此,如果Id自己将每个抽象方法委托给,就像在第一个示例中一样,更改的值确实会更改方法的行为。但是,上面的代码编译成这段Java代码: 因此,显然,Kotlin编译器不只是使用字段,而是决定在创建时将其复制到

  • Kotlin具有委托属性,这是一个非常好的特性。但我正在研究如何获取和设置这些值。假设我想得到委托的财产的价值。在get()方法中,如何访问该值? 这是我如何实施的一个例子: 我无法理解的主要问题是,我如何将值设置为委托类被分配到的实际属性。当我将“NEW”赋给属性< code>p时,如何将该值存储到变量< code>p中,或者使用get读取传递给< code>p的新值?我是不是错过了一些基本的东

  • 主要内容:类委托,属性委托,标准委托,可观察属性 Observable,把属性储存在映射中,Not Null,局部委托属性,属性委托要求,翻译规则,提供委托委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口

  • 委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口 Base 所有方法,并且委托一个传入的 Base 类的

  • 下面是我在gradle的留档https://docs.gradle.org/current/userguide/tutorial_using_tasks.html中发现的代码片段 在上面,hello是提供任务定义/操作的TaskProvider类型。对hello的第二个调用是扩展任务的行为。 这个委托使用看起来有点让我困惑。以下是困扰我的问题: 1) 在检查反编译的字节码时,我看到了任务。注册返回