首页 > 解决方案 > Hibernate:外键的列数错误。应该是 1

问题描述

我正在尝试映射到实体 Report 和 ReportLookup:

@Entity
public class Report extends AbstractMigrationObject implements Serializable {
    @JsonIgnore
    @Id
    private Long reportId;
    private String reportName;
    private String appName;
    private Integer reportNum;
    private String issue;
    @JsonProperty
    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumns({
            @JoinColumn(name = "reportName"),
            @JoinColumn(name = "appName"),
    })
    private Set<ReportLookup> lookupSet;

@Entity
public class ReportLookup implements Serializable {
    @JsonIgnore
    @Id
    private Long reportLookupId;
    private String parameterName;
    private String attributeName;
    private String lookupName;
    private Integer sequence;
    private String labelOverride;
    private String defaultValue;
    private Integer required;
    private Integer hidden;
    private String reportName;
    private String operator;
    private Integer multiLookup;
    private Integer reportNum;
    private String appName;
    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "appName", insertable = false, updatable = false),
            @JoinColumn(name = "reportName", insertable = false, updatable = false)
    })
    private Report report;

我不知道如何映射复合外键。总是得到这个错误:

org.springframework.beans.factory.BeanCreationException:创建类路径资源[persistance-context.xml]中定义的名称为“entityManagerFactory”的bean时出错:调用init方法失败;嵌套异常是 org.hibernate.AnnotationException: A Foreign key refering ru.ocrv.ekasui.changemonitoring.maximo.entity.report.Report from ru.ocrv.ekasui.changemonitoring.maximo.entity.report.ReportLookup 的列数错误. 应该是 1

标签: javaspringhibernatejpa

解决方案


reportId抱歉,如果您想在ReportLookup表中添加一个并ReportLookup在报告表中删除第二个@JoinColumn,则不能添加两个具有相同名称的列 ReportLookup

@ManyToOne
@JoinColumns({
        @JoinColumn(name = "appName", insertable = false, updatable = false)
})
private Report report; 

并在报告中:

@OneToMany(fetch = FetchType.EAGER)
@JoinColumns({
        @JoinColumn(name = "reportName")
})
private Set<ReportLookup> lookupSet;

第二种解决方案 ,您应该在主体实体中添加 @JoinColumns

@JsonProperty
@OneToMany(fetch = FetchType.EAGER)
@JoinColumns({
        @JoinColumn(name = "reportName"),
        @JoinColumn(name = "appName"),
})
private Set<ReportLookup> lookupSet;

推荐阅读