2012-12-14 2 views
7

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

Vendor (VendorID - рк, vendorEid, имя)
VendorContactBridge (BridgeID -pk, vendorEid, contactEid)
Контакта (ContactId -pk, contactEid, телефон)

vendorEid и contactEid не являются первичным ключом таблицы, а используются в качестве столбца объединения в таблице Join 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 -

@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 fetch, который я дал в объекте Vendor, я не получаю исключения, но он не загружает коллекцию. Что случилось с ассоциацией?

ответ

10

В соответствии с пунктом JPA 2.0 specs 11.1.21 JoinColumn annotaion на странице 379

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

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

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

+0

Вариант 2: Вы имеете в виду, я должен сделать два дб позвонить по одному для получения ContactEid из VendorContactBridge на основе VendorEid а снова связаться с Ased на ContactEid? Правильно ли я понимаю? – Pankaj

+0

Это будет основной принцип. Но было бы лучше использовать собственный запрос, так как вы могли бы сделать соединение и, таким образом, использовать один запрос sql для извлечения объектов. – Eelke

Смежные вопросы