2011-08-25 57 views
4

我的課程看起來像這些。爲什麼同一列被選中4次?映射有什麼問題?爲什麼Hibernate 4次選擇相同的列?幫助映射?

@Entity @Table(name="CLIENTS") 
public class Client implements Serializable { 

    @Id @GeneratedValue @Column(name="GENERATED_ID") 
    private Long id; 

    @Column(name="NAME") 
    private String name; 

    @OneToMany(cascade=CascadeType.ALL, mappedBy="client", fetch=FetchType.EAGER) 
    private Map<ParamPK, Param> params = new HashMap<ParamPK, Param>(); 
} 

@Entity @Table(name="PARAMS") 
public class Param implements Serializable { 

    @EmbeddedId 
    private ParamPK paramPK; 

    @Column(name="VALUE") 
    private String value; 

    @ManyToOne @MapsId("clientId") 
    private Client client; 
} 

@Embeddable 
public class ParamPK implements Serializable { 

    @Column(name="PARAM_KEY") 
    private String key; 

    @Column(name="CLIENT_GENERATED_ID") 
    private Long clientId; 
} 

select生成的查詢獲得同一列4次。

/* from Client */ 
select 
    client0_.GENERATED_ID as GENERATED1_1_, 
    client0_.NAME as NAME1_ 
from 
    CLIENTS client0_ 

/* load one-to-many Client.params */ 
select 
    params0_.client_GENERATED_ID as client3_1_1_, 
    params0_.client_GENERATED_ID as client3_1_, 
    params0_.PARAM_KEY as PARAM1_1_, 
    params0_.CLIENT_GENERATED_ID as CLIENT3_1_, 
    params0_.client_GENERATED_ID as client3_0_0_, 
    params0_.PARAM_KEY as PARAM1_0_0_, 
    params0_.VALUE as VALUE0_0_ 
from 
    PARAMS params0_ 
where 
    params0_.client_GENERATED_ID=? 

注意使用Hibernate 3.5.3。其餘的樣板代碼已被刪除爲無關緊要。

+0

你可以顯示JPQL查詢嗎? – Jasper

+1

不確定它會有幫助,但是您是否嘗試在您的地圖上添加MapKey(name =「paramPK」)註釋? –

+0

@Psy查詢是普通的'em.createQuery(「來自客戶端」);' – Ram

回答

3

你忘了告訴Hibernate是什麼構成了參數圖的關鍵。下面的註釋添加到此地圖:

@OneToMany(cascade=CascadeType.ALL, mappedBy="client", fetch=FetchType.EAGER) 
@MapKey(name = "paramPK") 
private Map<ParamPK, Param> params = new HashMap<ParamPK, Param>(); 

這告訴Hibernate的帕拉姆實體的paramPK屬性是地圖的關鍵。