2016-02-12 30 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; 

就是這樣,現在冬眠知道什麼類型的映射和列名與數據庫表來使用。我曾假設它會從實體中挑選出來,但我猜不是。