-
Feb 25th, 2011, 02:31 AM
#1
CreateQuery problem with compund keys
Hi
I have a problem when I do a createQuery (in Hibernate) when I am using a compund key. I have searched and searched on internet but cannot find the solution.
I have table experience in mysql:
project_id int(15) PK
person_id int(15) PK
competence_id int(15) PK
grade_id int(15)
from_date date
to_date date
description varchar(4000),
I have a class Experience.java
-----------
package experience;
import java.util.Date;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
//mysql> create table experience (project_id int(15) ,person_id int(15),competence_id int(15),grade_id int(15),from_date date,to_date date,description varchar(4000),
// primary key(project_id,person_id,competence_id));
// Query OK, 0 rows affected (0.08 sec)
@Entity
@Table(name = "experience")
public class Experience
{
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="project_id", column=@Column(name="project_id")),
@AttributeOverride(name="person_id", column=@Column(name="person_id")),
@AttributeOverride(name="competence_id", column=@Column(name="competence_id"))})
private ExperienceId experienceId;
@Column(name = "grade_id")
private Long gradeId;
@Column(name = "from_date")
private Date fromDate;
@Column(name = "to_date")
private Date toDate;
@Column(name = "description")
private String description;
@Id
public ExperienceId getExperienceId() {
return experienceId;
}
public void setExperienceId(ExperienceId experienceId) {
this.experienceId = experienceId;
}
public Long getGradeId() {
return gradeId;
}
public void setGradeId(Long gradeId) {
this.gradeId = gradeId;
}
public Date getFromDate() {
return fromDate;
}
public void setFromDate(Date fromDate) {
this.fromDate = fromDate;
}
public Date getToDate() {
return toDate;
}
public void setToDate(Date toDate) {
this.toDate = toDate;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
---------------
I have a class ExperienceId.java for the compund keys
----------------
package experience;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
@Embeddable
public class ExperienceId implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;
@Column(name="project_id")
private Long projectId;
@Column(name="person_id")
private Long personId;
@Column(name="competence_id")
private Long competenceId;
public ExperienceId(Long projectId, Long personId, Long competenceId)
{
this.projectId = projectId;
this.personId = personId;
this.competenceId = competenceId;
}
public Long getProjectId() {
return projectId;
}
public void setProjectId(Long projectId) {
this.projectId = projectId;
}
public Long getPersonId() {
return personId;
}
public void setPersonId(Long personId) {
this.personId = personId;
}
public Long getCompetenceId() {
return competenceId;
}
public void setCompetenceId(Long competenceId) {
this.competenceId = competenceId;
}
@Override
public boolean equals(Object arg0)
{
if(arg0 == null)
return false;
if(!(arg0 instanceof Experience))
return false;
ExperienceId arg1 = (ExperienceId)arg0;
return (this.projectId.longValue() == arg1.getProjectId().longValue() &&
this.personId.longValue() == arg1.getPersonId().longValue() &&
this.competenceId.longValue() == arg1.getCompetenceId().longValue());
}
@Override
public int hashCode()
{
int hsCode = projectId.hashCode() + 19 * personId.hashCode() + 31 * competenceId.hashCode();
return hsCode;
}
}
----------
When I try something like
Experience experience = (Experience)session.createQuery("from Experience e where e.gradeId = :gradeId").setLong("gradeId", request.getGradeId());
then I get :
org.springframework.ws.soap.client.SoapFaultClient Exception: org.hibernate.impl.QueryImpl cannot be cast to experience.Experience
I also try to declare it as a Query, it then runs but I dont get any result returned. I have data in the table.
Also I have discovered that if I look in mysql and do describe, additional columns has been added automatically at some point. It seems that is does this when connecting to the database
??, columns named after the instance variables has been added in the experience table. ie competenceId, personId, projectId, fromDate,gradeId,toDate.
Can anyone help?
-
Feb 25th, 2011, 07:59 AM
#2
Solved
I solved the problem by adding a default constructor in ExperienceId and moving the @EmbeddedId to the instance variable in Experience.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules