我有以下模型: A 类型的实体与许多类型的实体(B,C)有关联。每个 B 实体在 A 中最多出现一对,但同一个 C 实体可以多对出现。例如:
A1 --> (B1, C1)
--> (B2, C2)
--> (B3, C1)
A2 --> (B1, C3)
--> (B2, C4)
--> (B3, C4)
这遵循存储在 A 中的 java.util.Map<B, C> 的语义。此外,每个 C 仅针对一个实体 A 出现,因此 A 到 C 的关系是 OneToMany。我想保留这样的 Map,Java EE6 doc中出现了类似的示例。据我所知,我的代码(如下)与示例基本相同:
@Entity
public class A implements Serializable {
@OneToMany(fetch= FetchType.EAGER)
@JoinTable(name="A_BC_MAP",
joinColumns=@JoinColumn(name="A_ID"),
inverseJoinColumns=@JoinColumn(name="C_ID"))
@MapKeyJoinColumn(name="B_ID")
private Map<B, C> pinnedCourses = new HashMap<Course, ScheduleTerm>();
...
}
A_BC_MAP 的数据库模式按预期出现,具有三列连接表(A_ID、B_ID、C_ID)。但是,主键约束由 (A_ID, C_ID) 对组成。因此,我不能在数据库中存储多个(映射键)B 与相同的(映射值)C,就像我在映射中一样。
这是预期的行为吗?对于地图语义,我希望主键由(A_ID,B_ID)组成。难道我做错了什么?
我目前正在使用 EclipseLink 2.3.0。