【问题标题】:Hibernate: a foreign key has the wrong number of column. should be 1Hibernate:外键的列数错误。应该是 1
【发布时间】:2019-11-20 09:27:57
【问题描述】:

我正在尝试映射到实体 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

【问题讨论】:

  • 你能分享一下你的两个表的数据库方案吗?

标签: java spring hibernate jpa


【解决方案1】:

我不确定,但您应该尝试使用您的类的两个 ID 更改您的 @JoinColumns 结构

    @JoinColumns({
        @JoinColumn(name = "reportId", insertable = false, updatable = false),
        @JoinColumn(name = "reportLookupId", insertable = false, updatable = false)
})

【讨论】:

    【解决方案2】:

    抱歉,您不能添加两个同名的列,如果您想在ReportLookup 表中添加reportId 并在报告表中添加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;
    

    【讨论】:

      猜你喜欢
      • 2014-10-21
      • 2017-09-11
      • 2015-01-28
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      相关资源
      最近更新 更多