我有三个表,Member
,Address
和Mem_Addr
。
Member
和Address
个实体由Mem_Addr
表格映射/连接。多对多。
我有Member
和Address
的以下实体:
@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
为外键。
答案 0 :(得分:1)
不幸的是,没有办法,Hibernate要求你的表拥有主键。
您可以查看this document。
答案 1 :(得分:1)
你确定Mem_Addr
表是多对多的,而不是一对多的吗?我看不出单个Address
如何与多个Member
...
假设它实际上是一对多的,请按照{{3}中所述,通过@SecondaryTable注释将Address
实体映射到Mem_Addr
和Address
表格通过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。