База данных не записывается при редактировании отношений с обратной стороны в отношении ManyToMany

#jpa #orm #eclipselink #persistence #java-ee-7

#jpa #orm #eclipselink #постоянство #java-ee-7

Вопрос:

Поставщиком JPA является EclipseLink. Наличие следующих объектов:

 @Entity
class Symptom {

    @ManyToMany(mappedBy = "symptoms")
    private Set<Disorder> disorders;
}

@Entity
class Disorder {

    @ManyToMany
    @JoinTable(name = "disorder_symptoms")
    private Set<Symptom> symptoms;
}
 

Один симптом можно обнаружить при многих расстройствах, и у многих расстройств может быть много симптомов. Symptom определяется как обратная (не владеющая) сторона отношения, но это двунаправленное отношение, это не должно иметь значения.

Когда я добавляю новый признак Disorder , таблица базы disorder_symptoms данных обновляется, как и ожидалось. Но когда я добавляю беспорядок Symptom , таблица не заполняется. Пробовал с cascade набором атрибутов для обеих сторон, все еще безрезультатно.

Что-то не так, что я здесь делаю?

Комментарии:

1. «но поскольку это двунаправленное отношение, это не должно иметь значения». Почему вы так говорите? Двунаправленные отношения требуют, чтобы вы обновляли обе стороны, чтобы синхронизировать их с тем, что вы хотите в базе данных, но только изменения на стороне владельца влияют на то, что находится в базе данных. Убедитесь, что вы установили обе стороны и что расстройство, которое вы хотите указать на симптом, правильно объединено в модуль сохранения, чтобы изменения были обнаружены.

2. @Chris, причина в том, что есть единственный источник истины — это одна таблица. Каково ваше мнение о том, чтобы сделать обе стороны владельцами — одинаковыми @JointTable(name =»…») и удалить mappedBy атрибут? Когда я пробовал это в различных вариантах использования, мой провайдер не жалуется, и я получаю желаемое поведение.

3. Провайдеру будет небезразлично, поскольку это будет означать, что у вас есть два доступных для записи сопоставления, предназначенных для управления одним и тем же столбцом внешнего ключа, намеренно, чтобы они могли отличаться и не синхронизироваться друг с другом. Это может работать, но только до тех пор, пока это не произойдет в кажущихся странными ситуациях. Если вы собираетесь изменить только одну сторону, сохраните сторону владельца или сделайте ее однонаправленной.