У меня возникли некоторые странные ситуации, когда у меня есть, например, объект, называемый Статьи, которая имеет отношение к Поставщику, но также поставщику Связаться Лицо. Например:JPA отображение проблемы при отображении двух объектов с же `JoinColumn`
Поставщик связан со статьей на Supplier_Id, а ContactpersonSupplier связан со статьей обоими Supplier_Id (к SupplierID) и Supplier_Contactperson_Id (к Id).
Итак, теперь мы нанесем все отношения на Article
:
@JoinColumn(name = "Supplier_Id")
private Supplier supplier;
@JoinColumns({
@JoinColumn(name = "Supplier_Id"),
@JoinColumn(name = "Supplier_Contactperson_Id")
private SupplierContactperson supplierContactperson;
Это не работает, потому что мы картографирования Supplier_Id дважды, один раз supplier
и один раз для supplierContactperson
. Если вы сделаете это, вы получите следующее исключение:
org.hibernate.MappingException: Repeated column in mapping for entity: Article column: Supplier_Id (should be mapped with insert="false" update="false")
В обычной ситуации вы бы связать их так: Article
->ContactpersonSupplier
->Supplier
, и тогда не будет никаких проблем.
Однако ContactpersonSupplier
не требуется, но Supplier
не требуется. Это означает, что, если мы покинем контактного лица, мы не сможем предоставить поставщика.
Мы не можем использовать insertable = false, updatable = false
по той же причине, если мы поместим эти значения на supplier
, мы не сможем добавить поставщика, если контактное лицо не предоставлено.
Мы также не можем добавить их на supplierContactperson
, потому что JPA/Hibernate требует, чтобы вы положили его на все @JoinColumn
внутри @JoinColumns
, и если мы это сделаем, мы не сможем сохранить контактного лица.
Одна идея состоит в том, чтобы просто сопоставить идентификаторы вместо использования связанных объектов, но нам интересно, есть ли альтернативный подход, который может работать. Итак, вопрос в том, как мы должны решить эту проблему с отображением?
Следует отметить, что структура данных не может быть изменена.
Вместо государства "это не работает", обеспечивают точное сообщение об ошибке вы получаете пожалуйста. Также, если я посмотрю на схему, я бы понял, что у контакт-провайдера есть свой уникальный идентификатор, а Article.supplier_contact_person отображает его непосредственно. – Gimby
@ Gimby Я думал, что ошибка была описана довольно хорошо в следующей части моего вопроса (что Hibernate выбрасывает исключение сопоставления и говорит, что вы должны помещать 'insert = false' и' update = false' на одно из двух соединений, потому что вы не может быть отображено дважды). В любом случае, я описал отношения между моими таблицами немного больше и представил сообщение об ошибке. – g00glen00b