Hibernate Mapping – 使用关联表连接两个表 – 但是有一个扭曲

我有以下实体… CustomerCardAddress

顾客:

  { 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没有主键。 它只有一个外键。

您可以在@OneToOne之后使用注释@JoinTable指向卡的表,因此您不需要卡的实体,但如果卡的表不仅仅是关系表,您可以将用户卡中的卡映射为@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; 

在第二种情况下,卡有一个由两个fks(客户和地址)组成的嵌入式pk

卡:

 @EmbeddedId private CustomerAddressPK id; 

CustomerAddressPK

 @Embeddable public class CustomerAddressPK(){ private String cust_id; private String card_id; } 

CustomerAddress之间的映射可以通过使用从属对象的概念来实现。

查看文档,您将找到类似的示例,其中Person实体与名为Name依赖对象之间存在映射。