Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Hibernate Mapping - Unindo duas tabelas com uma tabela de associação - Mas com um toque diferente


Você pode usar a anotação @JoinTable após o @OneToOne para apontar a mesa do cartão, então você não precisará de uma entidade para o cartão, mas se a tabela do cartão não for apenas uma tabela relacional, você poderá mapear o cartão no usuário como @OneToOne e tem um método @Transient 'getAddress()' que retorna 'this.card.getAddress()', mas na entidade do cartão você deve mapear a relação entre Endereço e Cartão(@OneToOne(mappedBy='card_id')), e em Endereço que você pode mapear card_id como @Id.

Primeira alternativa

Cliente:
@OneToOne
@JoinTable(name="card", joinColumns = @JoinColumn(name="cust_id"),
inverseJoinColumns = @JoinColumn(name="card_id"))
private Address address;

Segunda alternativa

Cliente:
@OneToOne(mappedBy="cust_id")
private Card card;

...
@Transient
public Address getAddress(){
 return this.card == null ? null : this.card.getAddress();
}

Cartão:
@OneToOne(mappedBy="card_id")
private Address address;

Endereço:
@Id
private String card_id;

No segundo caso o cartão tem um pk embutido que é formado por dois fks(Cliente e Endereço)

Cartão:
@EmbeddedId
private CustomerAddressPK id;

CustomerAddressPK
@Embeddable
public class CustomerAddressPK(){

  private String cust_id;
  private String card_id;
}