2016-09-22 90 views
0

我有两个表primary_table和secondary_table。JPA/Hibernate @SecondaryTable @PrimaryKeyJoinCloumn引用主表中的非主列

的休眠实体定义如下:

@Entity 
@Table(name = "primary_table") 
@SecondaryTable(name = "secondary_table", pkJoinColumns = 
@PrimaryKeyJoinColumn(name="secondary_id", referencedColumnName="secondary_id")) 
public class Primary{ 
    ... 
    @Id 
    @Column(name = "primary_id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long primaryId; 

    ... columns in the primary table 
    ... columns in the secondary table 
} 

的表格如下所示:

CREATE TABLE primary_table 
(
    primary_id INTEGER NOT NULL, 
    secondary_id INTEGER NOT NULL, 
    PRIMARY KEY(primary_id) 
) 
CREATE TABLE secondary_table 
(
    secondary_id INTEGER NOT NULL, 
    PRIMARY KEY(secondary_id) 
) 

简而言之:次级柱的主列中引用的一个非主柱主表。

然而,在启动应用程序时,休眠抱怨:

Caused by: org.hibernate.MappingException: Unable to find column with logical name: secondary_id in org.hibernate.mapping.Table(primary_table) and its related supertables and secondary tables 
at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:828) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final] 

我已经改变了referencedColumnName主表的primary_id,实际上是让PrimaryKey的引用的PrimaryKey和Hibernate是满意的。但是,我正在使用旧数据库,并且无法更改模式。

我的代码有什么问题?

非常感谢!

回答

0

辅助表的主列引用了主表的非主列,这就是问题所在。事实上,您在主表和次表之间有ManyToOne关系,并且应该将其视为ManyToOne,而不考虑此表的语义。