【问题标题】:Hibernate interprets two foreign key relations as composite primary key(MappingException). Why?Hibernate 将两个外键关系解释为复合主键(MappingException)。为什么?
【发布时间】:2015-03-18 19:57:32
【问题描述】:

我有三个类:A 与 B 具有 OneToMany 关系,B 与 C 具有 OneToMany 关系。我希望在 A 类中有一个 Map,其中 B_ID 作为键,B 对象作为值。 B 应该在列表中包含 C 对象。使用 A_IDB_A_ID 和 B_RUN_IDC_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”。
非常感谢任何帮助:)

【问题讨论】:

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


    【解决方案1】:

    A 类有第二个可嵌入的地图:

    @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 = "B_RUN_ID") 似乎将“B_RUN_ID”定义为主键。
    此外,正如我所研究的那样,无法连接不是主键和外键的列,因此 B_RUN_ID 的连接是不可能的。相反,我将外键列“C_B_ID”添加到 C 类并与“B_ID”连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2014-12-23
      • 1970-01-01
      • 2020-07-08
      • 2021-08-16
      • 1970-01-01
      • 2019-09-23
      相关资源
      最近更新 更多