#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 из внешнего интерфейса, если объект не является новым.