Hibernate将两个外键关系解释为复合主键(MappingException)。为什么?

时间:2015-01-20 14:33:42

标签: java hibernate annotations hibernate-mapping foreign-key-relationship

我有三个类:A与B具有OneToMany关系,B与C具有OneToMany关系。我希望在A类中有一个包含B_ID作为键而B对象作为值的Map。 B应该包含列表中的C对象。使用A_ID<> B_A_ID和B_RUN_ID<> C_RUN_ID完成连接。

A类:

class A{
@Id
@Column(name = "A_ID")
private Long aId;

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "T_B",
    schema = "owner",
    joinColumns = @JoinColumn(name = "B_A_ID",
            referencedColumnName = "A_ID",
            nullable = false))
@MapKeyColumn(name = "B_RUN_ID")
@Column(name = "B_STATUS")
@Enumerated(javax.persistence.EnumType.STRING)
private Map<Long, Status> trackings;

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "B_A_ID")
@MapKeyColumn(name = "B_ID")
private Map<Long,B> trackingB;
...}

B组:

class B{
@Id
@Column(name = "B_ID")
private Long bId;

@Column(name = "B_A_ID")
private A a;

@Column(name = "B_RUN_ID", unique=true)
private long runId;

@OneToMany(mappedBy = "c_runID")
private List<C> cTrackings;
...}

C类:

class C{
@Id
@Column(name = "C_ID",unique=true)    
private long id;

@ManyToOne
@JoinColumn(name = "B_RUN_ID")
private B c_runData;

@Column(name = "EX_ID")
private long externalId;
...}

我在部署时遇到以下错误:
MappingException:ForeignKey“C [B_RUN_ID]”必须与引用的主键“B [B_A_ID,B_RUN_ID]”具有相同的列数 我的问题:为什么这些外键被解释为复合主键? B的主键是生成的“B_ID” 非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:0)

A类有第二张Map as Embeddable:

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "T_B",
        schema = "owner",
        joinColumns = @JoinColumn(name = "B_A_ID",
                referencedColumnName = "A_ID",
                nullable = false))
@MapKeyColumn(name = "B_RUN_ID")
@Column(name = "B_STATUS")
@Enumerated(javax.persistence.EnumType.STRING)
private Map<Long, Status> trackings;

注释@MapKeyColumn(name =&#34; B_RUN_ID&#34;)似乎定义了&#34; B_RUN_ID&#34;作为主键。
  另外,正如我所研究的那样,无法连接非主键和外键的列,因此无法通过B_RUN_ID进行连接。相反,我添加了外键列&#34; C_B_ID&#34;到C级并加入&#34; B_ID&#34;。

相关问题