I'm working on legacy system, need to read some of the info from database. Below are the table relationship
Vendor (vendorId - pk, vendorEid, name)
VendorContactBridge (bridgeId -pk, vendorEid, contactEid)
Contact (contactId -pk, contactEid, phone)
vendorEid and contactEid are not the primary key of the table but used as join column in Join table VendorContactBridge.
Vendor 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;
}
Contact 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;
}
while running the query, getting below exception
SecondaryTable JoinColumn cannot reference a non primary key.
I removed the Eager fetch which i have given in Vendor entity, i dont get any exception but it doesn't load the collection. What's wrong with association ?
According to the JPA 2.0 specs paragraph 11.1.21 JoinColumn annotaion on page 379
Support for referenced columns that are not primary key columns of the referenced table is optional. Applications that use such mappings will not be portable.
It seems Hibernate choose not to implement this optional part. Other implementations might. I tried it on EclipseLink but that one does not work either (it fails validation).
I see two work arounds. One is to adjust your schema to use the primary keys which would be the right thing from a database design theory perspective. However that might not be an option because of other software depending on this schema which leaves option two. Work around it by NOT moddeling the relationship in JPA just use the eid's and retrieve the relevant objects yourself.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With