2016-02-12 31 views
-1

无法确定类型(使用Spring 3.1和休眠3.3)休眠MappingException:使用复合密钥

我正在使用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; 
    } 
} 
+0

谁曾经标记我-1请评论与推理的问题,以便我可以改善它,否则它只是一个无益的回应! – Jeremy

回答

0

我发现,答案是很简单,我需要注释的“设置“与实体中映射类型相同的组合键类中的”列“。

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

这里是代码改变我对CompositeKey发...

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

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

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

就是这样,现在冬眠知道什么类型的映射和列名与数据库表来使用。我曾假设它会从实体中挑选出来,但我猜不是。