Reputation: 2387
My classes look like these. Why does the same column get selected 4 times? What is problem with the mapping?
@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;
}
The queries generated by select gets same column 4 times.
/* 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=?
Note using Hibernate 3.5.3. Rest boilerplate code has been removed as irrelevant.
Upvotes: 4
Views: 694
Reputation: 691635
You forgot to tell Hibernate what constitutes the key of the map of parameters. Add the following annotation to this map:
@OneToMany(cascade=CascadeType.ALL, mappedBy="client", fetch=FetchType.EAGER)
@MapKey(name = "paramPK")
private Map<ParamPK, Param> params = new HashMap<ParamPK, Param>();
This tells Hibernate that the paramPK property of the Param entity is the key of the map.
Upvotes: 3