У меня есть следующие лица... Customer
, Card
и Address
Клиент:
{
private String cust_id; // Primary key
.....
@OneToOne
Address address; // I want to load address of the customer.
// Can change the association to @OneToMany, if needed
}
Карта:
{
private String card_id; // Primary Key
private String cust_id; // Foreign Key to Customer.cust_id
....
}
Адрес:
{
private String card_id; // Foreign key to card.card_id
private String address1;
.....
}
Когда я загружаю клиентов, я хочу загрузить Адреса с Card
ассоциации. Но сложная часть - Address
не имеет первичного ключа. У этого есть только внешний ключ.
Вы можете использовать аннотацию @JoinTable после @OneToOne, чтобы указать карточный стол, поэтому вам не понадобится сущность для карты, но если таблица карт - это не просто реляционная таблица, вы можете сопоставить карту в User как @OneToOne и используйте метод @Transient getAddress(), который возвращает 'this.card.getAddress()', но на объекте карты вы должны сопоставить отношение между адресом и картой (@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 (Customer and Address)
Карта:
@EmbeddedId
private CustomerAddressPK id;
CustomerAddressPK
@Embeddable
public class CustomerAddressPK(){
private String cust_id;
private String card_id;
}
Отображение между Customer
и Address
может быть выполнено с использованием концепции зависимых объектов.
Посмотрите на документацию, вы найдете аналогичный пример, где есть сопоставление между объектом Person
с зависимым объектом с именем Name
.