Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有辅助表的实体,配置pk join列。无法匹配列_Java_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

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

Java 具有辅助表的实体,配置pk join列。无法匹配列,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,我有两张桌子: monitors(id, unit_id, ...) units(id, value) 其中unit_id是units id的外键。我希望我的实体类监视器将字符串字段unit映射到units的值,而不是单独的unit实体字段。这就是我所拥有的: @Entity @Table(name = "monitors") @SecondaryTable(name = "units", pkJoinColumns = @PrimaryKeyJoinColumn(

我有两张桌子:

monitors(id, unit_id, ...)
units(id, value)
其中unit_id是units id的外键。我希望我的实体类监视器将字符串字段unit映射到units的值,而不是单独的unit实体字段。这就是我所拥有的:

@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.dialent.mysql5dialent作为方言,使用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;
}
我在“on子句”中获得了o.h.engine.jdbc.spi.SqlExceptionHelper:未知列“unit.unit\u id”

hibernate的问题看起来像是被我美化了 选择 从监视器 左外连接 监视器上的单位。id=单位。单位\U id 在哪里

监视器上的.id=unit.unit\u id应该在监视器上。unit\u id=unit.id

您已经在@PrimaryKeyJoinColumn中切换了名称和ReferenceColumnName


名称指的是当前表中的列,但@SecondaryTable范围内的当前表是units。您也可以在异常中看到它-它正在查找您在监视器中作为referencedColumnName放入的unit_id。

您误用/误解了JPA辅助表。 如果将Monitor over字段存储在辅助表单元中,则monitors表中将没有指向该字段的FK。单元id的主键将是返回监视器id主键的FK。请参阅

referencedColumnName的使用适用于实体表中存在复合PK的情况,因此您必须跨您没有的相关列/字段进行映射


只有在实体表中有一个FK来表示字段时,才有1-1/N-1关系。辅助表不是这种情况。

谢谢您的评论,请参阅我上面的编辑,了解这样做的结果。