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



我有两个数据库类,计划和策略,带有Hibernate/JPA注释:

@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
}

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

一旦它们被创建,plan.topStrat 应该再也不会为空(这是一个业务规则)。 所以叫myPlan.topStrat有点奇怪!!在六个地方。 有没有一些简单的标准方法来解决这个问题? 一些我不知道的成语?

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

这是一个极端情况,没什么大不了的。 但如果有一些简单而优雅的方法来解决这个问题,我很想知道。

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

最新更新