具有辅助表的实体,配置pk连接列。无法匹配列

时间:2017-01-21 13:06:12

标签: java hibernate jpa spring-data-jpa

我有两张桌子:

monitors(id, unit_id, ...)
units(id, value)

其中unit_id是单位'id的外键。我想要的是我的实体类Monitor有一个字符串字段unit映射到单位'value而不是单独的单位实体字段。这就是我所拥有的:

@Entity
@Table(name = "monitors")
@SecondaryTable(name = "units",  
  pkJoinColumns = @PrimaryKeyJoinColumn(
                    name = "id",                  
                    referencedColumnName = "unit_id"))
public class Monitor {
private String unit;

...

@Column(table = "units", name = "value")
public String getUnit() {
    return unit;
}

public void setUnit(String unit) {
    this.unit = unit;
}

但是,尝试使用此操作会导致

Caused by: org.hibernate.MappingException: 
Unable to find column with logical name: unit_id in org.hibernate.mapping.Table(monitors) 
and its related supertables and secondary tables

at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:828)`

我使用org.hibernate.dialect.MySQL5Dialect作为方言,org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl作为物理命名策略

这里发生了什么?

修改

如果我改为交换列名(如下所示),如下所示:

@Entity
@Table(name = "monitors")
@SecondaryTable(name = "units",  pkJoinColumns = @PrimaryKeyJoinColumn(referencedColumnName = "id", name = "unit_id"))
public class Monitor {

...

@Column(name = "value", table = "units")
public String getUnit() {
    return unit;
}

我得到o.h.engine.jdbc.spi.SqlExceptionHelper : Unknown column 'unit.unit_id' in 'on clause'

和hibernate的查询看起来像这样(由我美化)
select ... from monitors monitor left outer join units unit on monitor.id=unit.unit_id where ...

on monitor.id=unit.unit_id应为on monitor.unit_id=unit.id

2 个答案:

答案 0 :(得分:1)

您误用/误解了JPA辅助表。 如果您在辅助表Monitor中存储units字段,则monitors表中将没有FK指向它。 unitsid)的PK将是FK,回到monitorsid)的PK。请参阅this reference

使用referencedColumnName适用于实体表中存在复合PK的情况,因此您必须映射相对列/字段(您不具备这些字段)。

唯一一次在实体表中使用FK来表示字段是您具有1-1 / N-1关系的地方。次要表不是这种情况。

答案 1 :(得分:0)

您已切换module: { loaders: [ // Pass *.jsx files through jsx-loader transform { test: /\.js$/, loaders: ['react-hot','jsx?harmony'] }, {test: /\.(png|jp?g|gif|svg|woff|woff2|ttf|eot|ico)?(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'file?name=fonts/[name].[hash].[ext]?'}, {test : /\.(ttf|eot|svg|woff(2)?)(\?[a-z0-9=&.]+)?$/, loader : 'file-loader'} ] } 中的namereferencedColumnName

@PrimaryKeyJoinColumn引用当前表中的列 - 但name范围内的当前表为@SecondaryTable。你也可以在异常中看到它 - 它正在寻找units(你在unit_id中放置referencedColumnName