Можете да използвате анотацията @JoinTable след @OneToOne, за да посочите таблицата на картата, така че няма да имате нужда от обект за карта, но ако таблицата на картата не е просто релационна таблица, можете да картографирате картата в User като @OneToOne и имат @Transient 'getAddress()' метод, който връща 'this.card.getAddress()', но в обекта на картата трябва да картографирате връзката между Address и Card(@OneToOne(mappedBy='card_id')), и в Адрес, на който можете да картографирате card_id като @Id.
Първа алтернатива
Клиент:
@OneToOne
@JoinTable(name="card", joinColumns = @JoinColumn(name="cust_id"),
inverseJoinColumns = @JoinColumn(name="card_id"))
private Address address;
Втора алтернатива
Клиент:
@OneToOne(mappedBy="cust_id")
private Card card;
...
@Transient
public Address getAddress(){
return this.card == null ? null : this.card.getAddress();
}
Карта:
@OneToOne(mappedBy="card_id")
private Address address;
Адрес:
@Id
private String card_id;
Във втория случай картата има вграден pk, който се формира от два fks (клиент и адрес)
Карта:
@EmbeddedId
private CustomerAddressPK id;
CustomerAddressPK
@Embeddable
public class CustomerAddressPK(){
private String cust_id;
private String card_id;
}