2

我有以下模型: 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。

4

1 回答 1

0

我假设您正在使用 EclipseLink 来定义您的 DDL?您总是可以使用自己的 DDL 脚本。

在 OneToMany 中存在重复项是不常见的,但使用映射键可能是可能的,您可以记录一个错误以让 DDL 生成将映射键定义为主键而不是目标外键。

于 2012-07-31T14:30:58.100 回答