Kotlin数据库实体/对象的可为空性单独创建,但一起使用

问题描述 投票:0回答:1

我有两个数据库类,Plan和Strategy with Hibernate / JPA annotations:

@Entity
@Table(name = "plan")
class Plan() : Idd {
    @get:Id
    @get:GeneratedValue(strategy = IDENTITY)
    @get:Column(name = "id", unique = true, nullable = false)
    override var id: Long = 0

    @get:ManyToOne(fetch = FetchType.LAZY)
    @get:JoinColumn(name = "top_strat_id", nullable = false)
    var topStrat: Strategy?
}

@Entity
@Table(name = "strategy")
class Strategy(
        @get:ManyToOne(fetch = FetchType.LAZY)
        @get:JoinColumn(name = "plan_id", nullable = false)
        var plan: Plan
) : Idd {
    @get:Id
    @get:GeneratedValue(strategy = IDENTITY)
    @get:Column(name = "id", unique = true, nullable = false)
    override var id: Long = 0
}

您可以看到有一个循环引用,其中每个策略都有一个计划,每个计划都有一个topStrat。我很确定我需要将计划持久保存到数据库中,以便获取自动生成的ID。然后我用我的计划创建一个新的策略并保存它,以便它也获得一个自动生成的ID。我需要将Plan.topStrat保留为可创建的。

一旦创建它们,plan.topStrat就不应该再次为null(这是一个业务规则)。所以调用myPlan.topStrat真是太奇怪了!在六个地方。有没有一些简单的标准处理方法?有些成语我不知道?

这发生在我工作的数据库中的几个地方。另一个例子是我们的User表随着时间的推移获得了太多列。我们将其拆分为User和User2。用户拥有每个屏幕上所需的内容。 User2有偶尔访问的东西。我需要将User.user2保留为null以创建用户并获取ID。然后我想我实际上将User2的ID设置为与其相关的用户ID('因为它是1:1)。保存后,User.user2永远不会再为null。

这是一个极端的案例,并不是什么大不了的事。但如果有一些简单而优雅的方式来解决这个问题,我很想知道。

jpa kotlin persistence nullable notnull
1个回答
1
投票

你应该能够使用lateinit。虽然您需要注释@field:而不是@get:,否则JPA提供程序将在尝试访问它时抛出。

© www.soinside.com 2019 - 2024. All rights reserved.