繁体   English   中英

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

[英]Hibernate Mapping - Joining two tables with an association table - But with a twist

我有以下实体... 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之间的映射可以使用Dependent对象的概念。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM