【问题标题】:How do I persist Map<Entity, Entity> with map semantics in JPA2如何在 JPA2 中使用地图语义持久化 Map<Entity, Entity>
【发布时间】:2012-07-24 02:24:44
【问题描述】:

我有以下模型:类型 A 的实体与多对类型(B,C)的实体有关联。每个 B 实体在 A 中最多出现一对,但同一个 C 实体可以多对出现。例如:

A1 --> (B1, C1)
   --> (B2, C2)
   --> (B3, C1)

A2 --> (B1, C3)
   --> (B2, C4)
   --> (B3, C4)

这遵循存储在 A 中的 java.util.Map 的语义。此外,每个 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。

【问题讨论】:

    标签: jpa map jpa-2.0 eclipselink


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我正在使用 EclipseLink,并且希望避免编写我自己的脚本来修复这一项。我最好在哪里记录这样的错误?
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2014-08-21
    • 2015-05-13
    • 1970-01-01
    • 2021-05-17
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多