Puede usar la anotación @JoinTable después de @OneToOne para señalar la tabla de la tarjeta, por lo que no necesitará una entidad para la tarjeta, pero si la tabla de la tarjeta no es solo una tabla relacional, podría asignar la tarjeta en Usuario como @OneToOne y tiene un método @Transient 'getAddress()' que devuelve 'this.card.getAddress()', pero en la entidad de la tarjeta debe asignar la relación entre Dirección y Tarjeta(@OneToOne(mappedBy='card_id')), y en Dirección que podría mapear card_id como @Id.
Primera 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();
}
Tarjeta:
@OneToOne(mappedBy="card_id")
private Address address;
Dirección:
@Id
private String card_id;
En el segundo caso, la tarjeta tiene un pk integrado que está formado por dos fks (cliente y dirección)
Tarjeta:
@EmbeddedId
private CustomerAddressPK id;
CustomerAddressPK
@Embeddable
public class CustomerAddressPK(){
private String cust_id;
private String card_id;
}