【问题标题】:hibernate MappingException: Could not determine type using composite keyhibernate MappingException:无法使用复合键确定类型
【发布时间】:2016-02-12 11:30:40
【问题描述】:

(使用 Spring 3.1 和休眠 3.3)

我正在使用带有实体的 IdClass,该实体映射到具有 3 列作为复合键的表。

我的测试失败,抛出运行时异常MappingException 抱怨休眠无法确定我用作组合键一部分的列之一的类型。在这种情况下,它是 set 列(在 db 表中也称为“set_id”)。

这是我实体的精简版

@Entity
@Table(name = "the_table")
@IdClass(CompositeKey.class)
public class MyEntity {

    @Id
    @Column(name = "page_id")
    private Integer pageId;

    @Id
    @Column(name = "xml_id")
    private Integer xmlId;

    @Id
    @ManyToOne
    @JoinColumn(name = "set_id")
    private CustomSet set;


    public CustomSet getSet() {
        return set;
    }

    public void setSet(CustomSet set) {
        this.set = set;
    }

    public Integer getPageId() {
        return pageId;
    }

    public void setPageId(Integer pageId) {
        this.pageId = pageId;
    }

    public Integer getXmlId() {
        return xmlId;
    }

    public void setXmlId(Integer xmlId) {
        this.xmlId = xmlId;
    }
}

这里是复合键 id 类

public class CompositeKey implements Serializable {

    private Integer pageId;

    private Integer xmlId;

    private CustomSet set;

    public CompositeKey(){}

    public CompositeKey(Integer pageId, Integer xmlId, CustomSet set){
        this.pageId = pageId;
        this.xmlId = xmlId;
        this.set = set;
    }

    public Integer getPageId() {
        return pageId;
    }

    public Integer getXmlId() {
        return xmlId;
    }


    public CustomSet getSet() {
        return set;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof CompositeKey)) return false;

        CompositeKey that = (CompositeKey) o;

        if (!getPageId().equals(that.getPageId())) return false;
        if (!getXmlId().equals(that.getXmlId())) return false;
        return getSet().equals(that.getSet());

    }

    @Override
    public int hashCode() {
        int result = getPageId().hashCode();
        result = 31 * result + getXmlId().hashCode();
        result = 31 * result + getSet().hashCode();
        return result;
    }
}

【问题讨论】:

  • 谁曾将我标记为-1,请理性地评论这个问题,以便我可以改进它,否则它只是一个无益的回应!

标签: java hibernate jpa composite-key


【解决方案1】:

我发现答案很简单,我需要用与实体中相同的映射类型来注释复合键类中的“set”列。

另外,因为我的表列名称与代码中的变量名称不同,所以我还必须将额外的列注释添加到复合键类中的变量中。

这是我对CompositeKey所做的代码更改...

@Column(name = "page_id")
private Integer pageId;

@Column(name = "xml_id")
private Integer xmlId;

@ManyToOne
@JoinColumn(name = "set_id")
private CustomSet set;

就是这样,现在 hibernate 知道该数据库表使用什么类型的映射和列名。我以为它会从实体中获取所有内容,但我想不会。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,我通过将注释 @ManyToOne 和 @JoinColumn 添加到主类的主键之一(很遗憾我丢失了)来解决它。在这里发帖以防万一有人犯了同样的错误。

    实际上为复合键上的属性添加注释对我来说会导致错误。我认为这不是正确的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2015-12-17
      相关资源
      最近更新 更多