Możesz użyć adnotacji @JoinTable po @OneToOne, aby wskazać tabelę karty, więc nie będziesz potrzebować encji dla karty, ale jeśli tabela karty nie jest tylko tabelą relacyjną, możesz zmapować kartę w User jako @OneToOne i mieć metodę @Transient 'getAddress()', która zwraca 'this.card.getAddress()', ale na encji karty musisz zmapować relację między Address i Card(@OneToOne(mappedBy='card_id')) oraz w Adres, który możesz zmapować card_id jako @Id.
Pierwsza alternatywa
Klient:
@OneToOne
@JoinTable(name="card", joinColumns = @JoinColumn(name="cust_id"),
inverseJoinColumns = @JoinColumn(name="card_id"))
private Address address;
Druga alternatywa
Klient:
@OneToOne(mappedBy="cust_id")
private Card card;
...
@Transient
public Address getAddress(){
return this.card == null ? null : this.card.getAddress();
}
Karta:
@OneToOne(mappedBy="card_id")
private Address address;
Adres:
@Id
private String card_id;
W drugim przypadku karta ma osadzony pk, który składa się z dwóch fks (klienta i adresu)
Karta:
@EmbeddedId
private CustomerAddressPK id;
Pakiet adresu klienta
@Embeddable
public class CustomerAddressPK(){
private String cust_id;
private String card_id;
}