Вопрос по one-to-many, jpa, hibernate-onetomany, hibernate – Связь один ко многим - объединение таблиц со столбцом без первичного ключа в JPA

8

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

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 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 entity, я не получаю никаких исключений, но это незагрузить коллекцию. Какие'не так с ассоциацией?

Ваш Ответ

2   ответа
10

СогласноJPA 2.0 характеристики абзац 11.1.21 JoinColumn аннотации на странице 379

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

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

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

Вариант 2: Вы имеете в виду, что я должен сделать два вызова БД: один для получения ContactEid от VendorContactBridge на основе VendorEid и еще раз для контакта, полученного от ContactEid? Правильно ли мое понимание? Pankaj
Это было бы основным принципом. Но было бы лучше использовать собственный запрос, поскольку вы могли бы выполнить соединение и, таким образом, использовать один SQL-запрос для извлечения объектов. Eelke
1

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

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

https://stackoverflow.com/a/4525951/527718

Похожие вопросы