Обнуляемость сущностей / объектов базы данных Kotlin, созданных отдельно, но используемых вместе - PullRequest
0 голосов
/ 22 марта 2019

У меня есть два класса базы данных, План и Стратегия с аннотациями 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
}

Вы можете видеть, что есть круговая ссылка, где у каждой Стратегии есть План, а у каждого Плана естьtopStrat.Я почти уверен, что мне нужно сохранить План в базе данных, чтобы он получил автоматически сгенерированный идентификатор.Затем я создаю новую стратегию со своим планом и сохраняю ее, чтобы она тоже получала автоматически сгенерированный идентификатор.Мне нужно оставить Plan.topStrat обнуляемым для создания.

После того, как они созданы, plan.topStrat никогда не должен снова иметь значение null (это бизнес-правило).Так что это странно - звонить myPlan.topStrat !!в полдюжины мест.Есть ли простой стандартный способ борьбы с этим?Какая-то идиома, о которой я не знаю?

Это происходит в нескольких местах в базе данных, над которой я работаю.Другой пример - наша таблица User, которая со временем набрала слишком много столбцов.Мы разделили его на User и User2.У пользователя есть то, что нужно на каждом экране.У User2 есть вещи, к которым иногда обращаются.Мне нужно оставить User.user2 нулевым, чтобы создать пользователя и получить идентификатор.Тогда я думаю, что на самом деле я установил идентификатор User2 равным идентификатору пользователя, к которому он относится (потому что это 1: 1).После сохранения User.user2 уже никогда не может быть пустым.

Это угловой случай, и ничего страшного.Но если есть какой-то простой и элегантный способ справиться с этим, я хотел бы знать.

1 Ответ

1 голос
/ 22 марта 2019

Вы должны быть в состоянии использовать lateinit.Хотя вам нужно будет аннотировать @field: вместо @get:, иначе провайдер JPA сгенерирует при попытке получить к нему доступ.

...