如何在JPA2 </entity,>中使用map语义持久化Map <entity,entity =“”>

时间:2012-07-24 02:24:44

标签: jpa map jpa-2.0 eclipselink

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

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

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

这遵循java.util.Map&lt; B,C&gt;的语义。存储在A中。此外,每个C仅出现在一个实体A中,因此A到C的关系是OneToMany。我想保留这样的地图,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,并且我可以在地图中存储相同的(地图值)。

这是预期的行为吗?对于映射语义,我希望主键由(A_ID,B_ID)组成。我做错了吗?

我目前正在使用EclipseLink 2.3.0。

1 个答案:

答案 0 :(得分:0)

我假设你使用EclipseLink来定义你的DDL?您可以随时使用自己的DDL脚本。

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