【发布时间】:2014-11-19 10:36:06
【问题描述】:
我有三张桌子,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。 (请不要问我关于设计的问题。它现在无法更改。)
所以当我加载成员时,我想加载该成员的所有地址位置。
解决办法是什么?
编辑:更多信息...
基本上一些Members 将在Mem_Addr 表中有一个新条目。对于Mem_addr 表中的每个条目,Address 表中都会有一个条目。
要获取成员的地址,我需要参考 Mem_Addr。 Mem_Addr 以addr_id 作为主键,Address 以addr_id 作为外键。
【问题讨论】:
-
地址实体中是否有 addr_id,因为我在 Mem 实体中看到您正在调用它?
-
@Rika 你是对的.. 我打错了。已更正。
-
我认为您可能可以在没有 Id 的情况下进行连接,但它必须具有 Embeddable 注释,请参阅此处stackoverflow.com/questions/767277/hibernate-and-no-pk
-
@Rika:如果您尝试映射的表是其他东西的外键,我认为@Embeddable 方法将不起作用。一个 Hibernate 实体应该是一个独立的、独立的东西,所以 Hibernate 会尝试在
Address中插入一个新行,这会由于未满足 FK 约束而失败并被回滚。 -
@Tim 如果他把 Mem_Addr 变成一个实体,然后把 String addr_id 变成一个实体,它可能会起作用;在地址到 MemAddr addr_id;然后做 Embeddable 的事情,它应该用级联正确插入它
标签: java oracle hibernate entity hibernate-onetomany