Ассоциация один ко многим - объединение таблиц со столбцом без первичного ключа в JPA

Я работаю над устаревшей системой, нужно прочитать некоторую информацию из базы данных. Ниже приведены таблицы отношений

Vendor (vendorId - pk, vendorEid, имя)
VendorContactBridge (bridgeId -pk, vendorEid, contactEid)
Контакт (contactId -pk, contactEid, телефон)

vendorEid и contactEid не являются первичным ключом таблицы, но используются в качестве столбца соединения в соединительной таблице VendorContactBridge.

Поставщик Entity -

@Entity
@Table(name="Vendor")
public class Vendor implements Serializable{

@Id
@Column(name="VENDORID")
private BigDecimal vendorId;

@Column(name="VENDOREID")
private BigDecimal vendorEid;

@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")},
inverseJoinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTACTEID")})
private Set<Contact> vendorContact;
}

Контактное лицо -

@Entity
@Table(name="CONTACT")
public class Contact implements Serializable{

@Id
@Column(name="CONTACTID")
private BigDecimal contactId;

@Column(name="CONTATEID")
private BigDecimal contactEId;

@ManyToOne
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTATEID")},
inverseJoinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")})
private Vendor vendor;
 }

во время выполнения запроса, получая ниже исключения

SecondaryTable JoinColumn не может ссылаться на не первичный ключ.

Я удалил Eager, который я дал в сущности Vendor, я не получаю никаких исключений, но он не загружает коллекцию. Что не так с ассоциацией?

2 ответа

В соответствии с параграфом 11.1.21 спецификации JPA 2.0, на странице 379 аннотации JoinColumn

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

Кажется, Hibernate решил не реализовывать эту необязательную часть. Другие реализации могут. Я попробовал это на EclipseLink, но это тоже не работает (не проходит проверку).

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

Я нашел решение этой проблемы.

Посмотреть здесь:

Другие вопросы по тегам