#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. Провайдеру будет небезразлично, поскольку это будет означать, что у вас есть два доступных для записи сопоставления, предназначенных для управления одним и тем же столбцом внешнего ключа, намеренно, чтобы они могли отличаться и не синхронизироваться друг с другом. Это может работать, но только до тех пор, пока это не произойдет в кажущихся странными ситуациях. Если вы собираетесь изменить только одну сторону, сохраните сторону владельца или сделайте ее однонаправленной.