我有两张桌子:
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
答案 0 :(得分:1)
您误用/误解了JPA辅助表。
如果您在辅助表Monitor
中存储units
字段,则monitors
表中将没有FK指向它。 units
(id
)的PK将是FK,回到monitors
(id
)的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'}
]
}
中的name
和referencedColumnName
。
@PrimaryKeyJoinColumn
引用当前表中的列 - 但name
范围内的当前表为@SecondaryTable
。你也可以在异常中看到它 - 它正在寻找units
(你在unit_id
中放置referencedColumnName
。