我有以下模型:类型A的实体与许多类型的实体对(B,C)有关联。每个B实体在A中最多出现一对,但同一C实体可以多对显示。例如:
A1 --> (B1, C1)
--> (B2, C2)
--> (B3, C1)
A2 --> (B1, C3)
--> (B2, C4)
--> (B3, C4)
这遵循java.util.Map< B,C>的语义。存储在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。
答案 0 :(得分:0)
我假设你使用EclipseLink来定义你的DDL?您可以随时使用自己的DDL脚本。
在OneToMany中有重复项是不寻常的,但可能使用map键,您可以记录一个错误,让DDL生成将map键定义为主键而不是目标外键。