org.hibernate.MappingException:外键必须与引用的主键具有相同的列数

时间:2013-09-19 10:26:20

标签: java hibernate

为什么我在hibernate应用程序中遇到以下异常。

Caused by: org.hibernate.MappingException: Foreign key (FK2C47CFCAB95CF1D: EMP [ADDR_ID,ADDR_ZIP])) must have same number of columns as the referenced primary key (ADDRESS [ID_COL])
    at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:110)
    at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:93)
    at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1714)
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1637)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1350)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:920)
    ... 9 more

我的映射

@ManyToOne
@JoinColumns({
    @JoinColumn(name="ADDR_ID", referencedColumnName="ID"),
    @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP")
})
@NotFound(action=NotFoundAction.IGNORE)
private AddressEntity addressEntity;

我的AddressEntity如下所示

public AddressEntity {
    @Id
    @Column(name = "ID_COL")
    private String item;

    @Column(name = "ID")
    private String ID;

    @Column(name = "ZIP")
    private String ZIP;

    ...
    ...

}

JoinColumn不需要指向主键。但仍然会发生异常

1 个答案:

答案 0 :(得分:0)

您的问题出在连接列定义中。您只能使用键列声明映射。

@ManyToOne
@JoinColumn(name="ADDRESS_COL", referencedColumnName="ID_COL")
@NotFound(action=NotFoundAction.IGNORE)
private AddressEntity addressEntity;

public AddressEntity {

    @Id
    @Column(name = "ID_COL")
    private String item;

    @Column(name = "ID")
    private String ID;

    @Column(name = "ZIP")
    private String ZIP;

    ...
}

其中ADDRESS_COL必须是您的emp表中的外键列,该列引用您的地址表的ID_COL