2017-01-11 30 views
1

當我嘗試使用組合鍵時保存實體時,出現異常。這是我嘗試保存的例外情況,模型和存儲庫。誰能幫忙?無法使用組合鍵保存實體

org.springframework.beans.TypeMismatchException:未能轉換類型的 屬性值 'org.CheckType _ _ $$ jvst96c_4' 爲屬性 'checkType' 所需的類型 'INT';嵌套的例外是 java.lang.IllegalArgumentException異常:無法轉換 類型的值「org.CheckType _ $$ _ jvst96c_4」所需類型「詮釋」財產 「checkType」:屬性編輯 [org.springframework.beans.propertyeditors.CustomNumberEditor] 返回類型的值不正確「org.CheckType _ $$ _ jvst96c_4」

@Entity 
public class CheckType { 
    @Id 
    private int id; 

    @NotNull 
    private String name; 

    @OneToMany(mappedBy = "checkType") 
    private List<ClientCheck> checks; 
    //getters and setters 
} 

@Entity 
public class Offer { 
    @Id 
    @Column(name = "offerid") 
    private Integer offerId; 
    //... 
    @OneToMany(mappedBy = "offer") 
    private List<ClientCheck> clientCheckList; 

    //getters and setters 
} 

@Entity 
@IdClass(ClientCheckId.class) 
public class ClientCheck { 
    @Id 
    @ManyToOne 
    @JoinColumn(name = "offer_id", referencedColumnName = "offerid") 
    private Offer offer; 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "check_type_id", referencedColumnName = "id") 
    private CheckType checkType; 

    @Id 
    private Date timestamp; 

    private String result; 
    //getters and setters 
} 

public class ClientCheckId implements Serializable { 
    private int offer; 
    private int checkType; 
    private Date timestamp; 

    //getters and setters 
    //equals and hashCode 
} 

public interface ClientCheckRepo extends JpaRepository<ClientCheck, ClientCheckId> { 
} 
+0

什麼是上下文?你如何創建和保存這個實體?通過MVC請求? –

+0

我不知道情境是否重要;我收到控制器的請求,進行/保存報價,創建時間戳,讀取檢查類型,併爲每個檢查獲得檢查結果,然後保存所有參數設置的檢查。 – Ivan

+0

上下文很重要,因爲錯誤'org.springframework.beans.TypeMismatchException'表明問題在於綁定請求參數。你能發佈相關的控制器代碼嗎? –

回答

0

如果另一實體是複合鍵的一部分,你必須聲明實體在你的ID級別,而不是它的ID:

public class ClientCheckId implements Serializable { 
    private int offer; 
    private CheckType checkType; 
    private Date timestamp; 

    //getters and setters 
    //equals and hashCode 
} 

如果你想要Hibernate的工作原理,錯誤信息是相當可讀的:org.CheckType_$$_jvst96c_4是你的類的豐富版本,Hibernate試圖通過反射分配給的checkType字段,並且由於類型不兼容而失敗。

+0

當我這樣做的時候它工作,但是當我也改變了offer的類型時(int-> Offer)。爲什麼它與Offer和CheckType不同? – Ivan

+1

這是**而不是** JPA 2.1規範說的:「如果實體中的Id屬性與父實體是多對一或一對一的關係,那麼id類中的相應屬性必須與[...]父實體的Id屬性的類型具有相同的Java類型「​​。請參閱* 2.4.1.1派生身份的規範* –

相關問題