1

我有三个表MemberAddressMem_Addr。 实体由表映射Member/连接。多对多。AddressMem_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 。(请不要问我关于设计的问题。它现在无法更改。)

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

解决办法是什么?

编辑:更多信息...

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

要获取成员的地址,我需要参考 Mem_Addr。Mem_Addraddr_id作为主键,Addressaddr_id作为外键。

4

3 回答 3

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;



  }

这是为没有主键的表找到的解决方法。正如你所看到的,它几乎是一个假身份证。

于 2014-09-24T21:19:15.570 回答
1

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

您可以查看此文档

于 2014-09-24T19:54:44.063 回答
0

你确定Mem_Addr桌子是多对多的,而不是一对多的吗?我不明白一个单一的如何Address与多个相关联Member......

假设它实际上是一对多的,通过@SecondaryTableAddress注释将您的实体映射到表Mem_Addr和表,如Hibernate 将两个表映射到一个类中所述,将 id 映射到、via以及通过.AddressMem_Addr.addr_idMemberMem_Addr.mem_idAddress

我没有这样做,但我相信它会起作用:

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

    ....
}
于 2014-09-24T20:19:08.177 回答