Задатчик полей не вызывается, когда список не пуст

#kotlin #spring-data-jpa #spring-data-rest

#котлин #весна-данные-jpa #пружина-данные-отдых

Вопрос:

У меня есть родительская сущность, которая содержит список дочерних сущностей. Я использую Spring Data Rest , чтобы не было пользовательского контроллера.

Это мои сущности:

 @Entity class Template(  childComponents: MutableListlt;AbstractLabelComponentgt; = mutableListOf(), ){  @Id  @GeneratedValue(strategy = GenerationType.AUTO)  var id: Long? = null   @JsonManagedReference  @OneToMany(mappedBy = "template", cascade = [CascadeType.ALL], orphanRemoval = true)  private var components: MutableListlt;AbstractLabelComponentgt; = childComponents  set(value){  field.clear()  field.addAll(value)  field.forEach { it.template = this }  }   fun addComponent(component: AbstractLabelComponent){  component.template = this  this.components.add(component)  } }  

И детский класс:

 @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes(  JsonSubTypes.Type(value = TextComponent::class, name = TextComponent.TYPE),  JsonSubTypes.Type(value = TextAreaComponent::class, name = TextAreaComponent.TYPE),  JsonSubTypes.Type(value = ImageComponent::class, name = ImageComponent.TYPE) ) abstract class AbstractLabelComponent(    @field:ManyToOne  @field:JsonBackReference  @field:JoinColumn(name="template_id")  open var template: Template? ){  @Id  @GeneratedValue(strategy = GenerationType.AUTO)  open var id: Long? = null }  

Это json, который я отправляю в API:

 {  "components": [  {  "id": 2300,  },  {  "id": 2302,  }  ],  "id": 1789 }  

Я оставил несколько простых полей, чтобы сделать его более читабельным. У меня нет репозитория для компонентов, а в репозитории шаблонов нет кода, кроме расширения базового репозитория crud. Сначала дочерние компоненты были созданы без каких-либо проблем, но template_id поле не было задано. Вот почему я создал сеттер для components поля, чтобы задать шаблон. Это прекрасно работает, когда я добавляю компоненты в шаблон, в котором нет компонентов, однако я заметил, что, когда я пытаюсь добавить их больше, у них снова нет идентификатора шаблона.

Я добавил точку останова в сеттер, и оказалось, что она не вызывается. Я подумал, вероятно, потому, что, если список не пуст, JPA не устанавливает список, а вместо этого добавляет в него элементы. Я прав? Если да, то есть ли способ указать ему использовать метод AddComponent вместо этого, чтобы я мог установить шаблон? Или любой другой способ убедиться, что ссылка на шаблон установлена?

Ответ №1:

Оказывается, разница между двумя сценариями заключалась не в количестве компонентов, присутствующих в базе данных, а в том, были ли какие-либо изменения в сущности. Не уверен, но похоже, что JPA не сохраняет сущность, если нет изменений, и, вероятно, он также не утруждает себя установлением такого рода отношений. Возможно, есть лучшее решение, но обходной путь состоит в том, чтобы установить идентификатор шаблона в JSON из внешнего интерфейса, если объект не является новым.