Hibernate Mapping - 没有@Id的连接表

时间:2014-09-24 19:49:54

标签: java oracle hibernate entity hibernate-onetomany

我有三个表,MemberAddressMem_AddrMemberAddress个实体由Mem_Addr表格映射/连接。多对多。

我有MemberAddress的以下实体:

@Entity 
@Table (name="Member")
public class Member{

    @Id  //....
    private Integer mem_id;

    @OneToOne
    @JoinTable     (name = "Mem_Addr", 
             joinColumns = @JoinColumn(name = "addr_id"), 
      inverseJoinColumns = @JoinColumn(name = "mem_id"))
    Set<Address> addresses = new HashSet<Address>;
    ...
}

Mem_Addr表(它没有关联实体)。

addr_id // (PK) Sequence
mem_id  // (FK to mem_id in Member table) 
....
....

Address实体。

@Entity
@Table(name="Address")
public class Address {

   private String addr_id; // Foreign Key to addr_id in Mem_addr table
   private String address1;
   ...
}

我在Address表/实体中没有ID。 (请不要问我关于设计的问题。现在不能改变。)

因此,当我加载成员时,我想加载该成员的所有地址位置。

解决方案是什么?

修改:更多信息...

基本上一些Member将在Mem_Addr表中有一个新条目。对于Mem_addr表中的每个条目,Address表中都会有一个条目。

要获取成员的地址,我需要引用Mem_Addr。 Mem_Addr以addr_id为主,地址为addr_id为外键。

3 个答案:

答案 0 :(得分:1)

不幸的是,没有办法,Hibernate要求你的表拥有主键。

您可以查看this document

答案 1 :(得分:1)

你确定Mem_Addr表是多对多的,而不是一对多的吗?我看不出单个Address如何与多个Member ...

相关联

假设它实际上是一对多的,请按照{{3}中所述,通过@SecondaryTable注释将Address实体映射到Mem_AddrAddress表格通过Mem_Addr.addr_id将其ID映射到Member,将Mem_Addr.mem_id映射到Address以及其他所有字段。

我没有这样做,但我相信它会奏效:

@Entity
@Table(name = "Address")
@SecondaryTable(name = "Mem_Addr", pkJoinColumns={
    @PrimaryKeyJoinColumn(name="addr_id" referencedColumnName="addr_id")
})
class Address {
    @Id
    @Column
    private String addr_id;

    ....
}

答案 2 :(得分:1)

好的,因为插入和更新不是必需的,以下(在理论上)应该可行:

@Entity
@Table(name = "Address")
class Address {

 @Id
 private AddressKey id;

 public void setId(AddressKey id) {
 this.id = id;
 }

 public void getId() {
 return id;
 }
}

@Embeddable
class AddressKey implements Serializable {
   @Column(name = "addr_id")
   private String addrId; //also the underscore should be deleted

   @Column(name = "address_1")
   private String address1;



  }

这是针对没有主键的表找到的解决方法。正如你所看到的,它几乎是一个虚假的Id。