hibernate MappingException:无法使用复合键确定类型

时间:2016-02-12 11:30:40

标签: java hibernate jpa composite-key

(使用Spring 3.1和hibernate 3.3)

我正在使用一个IdClass,其实体映射到一个包含3列作为复合键的表。

我的测试未能引发运行时异常MappingException抱怨hibernate无法确定用作复合键一部分的某列的类型。在这种情况下,它是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;
    }
}

2 个答案:

答案 0 :(得分:0)

我发现答案很简单,我需要注释" 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知道该数据库表使用什么类型的映射和列名。我以为它会从实体中挑选出来,但我猜不是。

答案 1 :(得分:0)

我有一个类似的问题,我通过将注释@ManyToOne和@JoinColumn添加到主类中的一个主键(不幸的是我丢失了)来解决了这个问题。以防万一有人犯同样的错误。

实际上在组合键上为属性添加注释对我造成了错误。我认为那不是正确的方法。