我有两个数据库类,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。
这是一个极端的案例,并不是什么大不了的事。但如果有一些简单而优雅的方式来解决这个问题,我很想知道。
你应该能够使用lateinit
。虽然您需要注释@field:
而不是@get:
,否则JPA提供程序将在尝试访问它时抛出。