Как сказать JPA управлять зависимыми объектами? - PullRequest
1 голос
/ 15 апреля 2020

Моя модель имеет типичное отношение «родители-дети», которое JPA-моделируется однонаправленным отношением @OneToMany:
a Parent имеет 0..n экземпляров Child (т.е. List<Child>) .

Попытка создать и сохранить Entity с одним зависимым Property следующим образом:

val a_parent = Parent(
        id = "I_am_a_parent",
        children = listOf(Child(kind="childish"))
)
parentRepository.save(a_parent)

неожиданно приводит к

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [parent_id]; nested exception is 
...
Caused by: org.postgresql.util.PSQLException: 
ERROR: null value in column "parent_id" violates not-null constraint
  Detail: Failing row contains (22, childish, null).

в строке parentRepository.save(a_parent).

Очевидно, JPA не устанавливает идентификатор родительского элемента для дочернего элемента (столбец children.parent_id).

Почему бы и нет? А как это сказать?

Код Parent и Child выглядит следующим образом

@Entity
@Table(name = "parents")
data class Parent (
        @Id
        @Column(name = "id")
        var id: String? = null,

        @OneToMany(cascade = [CascadeType.ALL], orphanRemoval = true)
        @JoinColumn(name = "parent_id")
        var properties: List<Child> = listOf()
)
@Entity
@Table(name = "children")
data class Child (
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        var id: Int? = null,

        @Column(name = "kind")
        var kind: String? = null
)

1 Ответ

1 голос
/ 15 апреля 2020

Однонаправленный OneToMany, возможно, должен быть реализован следующим образом ( ссылка ):

data class Parent (
  //...
    @OneToMany(cascade = [CascadeType.ALL], orphanRemoval = true)
    @JoinColumn(name = "parent_id", nullable = false)
    var properties: List<Child> = listOf()
)

Обратите внимание на nullable = false, если столбец базы данных parent_id не имеет значения null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...