Reshi
Reshi

Reputation: 799

Column does not exist - Hibernate ManyToMany association class

I'm facing the following problem. Imagine this data model:

enter image description here

As you can see project_function entity is association many to many entity.

Here are my entity classes.

PeronalCard:

@Entity
@Table(name = "personal_card")
@XmlRootElement
public class PersonalCard implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id_person")
    private Integer idPerson;

    /* SOME OTHER ATTRIBUTES */

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "projectFunctionPK.personalCard")
    private Set<ProjectFunction> projectFunctionSet;

    public PersonalCard() {
    }

    public Integer getIdPerson() {
        return idPerson;
    }

    public void setIdPerson(Integer idPerson) {
        this.idPerson = idPerson;
    }

    @XmlTransient
    public Set<ProjectFunction> getProjectFunctionSet() {
        return projectFunctionSet;
    }

    public void setProjectFunctionSet(Set<ProjectFunction> projectFunctionSet) {
        this.projectFunctionSet = projectFunctionSet;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idPerson != null ? idPerson.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof PersonalCard)) {
            return false;
        }
        PersonalCard other = (PersonalCard) object;
        if ((this.idPerson == null && other.idPerson != null) || (this.idPerson != null && !this.idPerson.equals(other.idPerson))) {
            return false;
        }
        return true;
    }

}

Project:

@Entity
@Table(name = "project")
@XmlRootElement
public class Project implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id_project")
    private Integer idProject;

    /* OTHER ATTRIBUTES*/

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "projectFunctionPK.project")
    private Set<ProjectFunction> projectFunctionSet;

    public Project() {
    }

    public Integer getIdProject() {
        return idProject;
    }

    public void setIdProject(Integer idProject) {
        this.idProject = idProject;
    }

    @XmlTransient
    public Set<ProjectFunction> getProjectFunctionSet() {
        return projectFunctionSet;
    }

    public void setProjectFunctionSet(Set<ProjectFunction> projectFunctionSet) {
        this.projectFunctionSet = projectFunctionSet;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idProject != null ? idProject.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Project)) {
            return false;
        }
        Project other = (Project) object;
        if ((this.idProject == null && other.idProject != null) || (this.idProject != null && !this.idProject.equals(other.idProject))) {
            return false;
        }
        return true;
    }

}

ProjectFunction:

@Entity
@Table(name = "project_function")
@XmlRootElement
@AssociationOverrides({
    @AssociationOverride(name = "projectFunctionPK.project", 
        joinColumns = @JoinColumn(name = "id_project", referencedColumnName = "id_project")),
    @AssociationOverride(name = "projectFunctionPK.personalCard", 
        joinColumns = @JoinColumn(name = "id_person", referencedColumnName = "id_person")) })
public class ProjectFunction implements Serializable {
    private static final long serialVersionUID = 1L;

    protected ProjectFunctionPK projectFunctionPK;

    private Date fromd;    
    private Date tod;

    public ProjectFunction() {
        this.projectFunctionPK = new ProjectFunctionPK();
    }

    @EmbeddedId
    public ProjectFunctionPK getProjectFunctionPK() {
        return projectFunctionPK;
    }

    public void setProjectFunctionPK(ProjectFunctionPK projectFunctionPK) {
        this.projectFunctionPK = projectFunctionPK;
    }

    @Column(name = "fromd")
    @Temporal(TemporalType.DATE)
    public Date getFromd() {
        return fromd;
    }

    public void setFromd(Date fromd) {
        this.fromd = fromd;
    }

    @Column(name = "tod")
    @Temporal(TemporalType.DATE)
    public Date getTod() {
        return tod;
    }

    public void setTod(Date tod) {
        this.tod = tod;
    }

    @Transient
    public Project getProject() {
        return projectFunctionPK.getProject();
    }


    public void setProject(Project project) {
        this.projectFunctionPK.setProject(project);
    }

    @Transient
    public PersonalCard getPersonalCard() {
        return this.projectFunctionPK.getPersonalCard();
    }

    public void setPersonalCard(PersonalCard personalCard) {
        //this.personalCard = personalCard;
        this.projectFunctionPK.setPersonalCard(personalCard);
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (projectFunctionPK != null ? projectFunctionPK.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof ProjectFunction)) {
            return false;
        }
        ProjectFunction other = (ProjectFunction) object;
        if ((this.projectFunctionPK == null && other.projectFunctionPK != null) || (this.projectFunctionPK != null && !this.projectFunctionPK.equals(other.projectFunctionPK))) {
            return false;
        }
        return true;
    }

}

And finally my embedded Primary Key ProjectFunctionPK:

@Embeddable
public class ProjectFunctionPK implements Serializable {

    @ManyToOne
    private Project project;
    @ManyToOne
    private PersonalCard personalCard;

    public ProjectFunctionPK() {
    }

    public Project getProject() {
        return project;
    }

    public void setProject(Project project) {
        this.project = project;
    }

    public PersonalCard getPersonalCard() {
        return personalCard;
    }

    public void setPersonalCard(PersonalCard personalCard) {
        this.personalCard = personalCard;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 41 * hash + Objects.hashCode(this.project);
        hash = 41 * hash + Objects.hashCode(this.personalCard);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final ProjectFunctionPK other = (ProjectFunctionPK) obj;
        if (!Objects.equals(this.project, other.project)) {
            return false;
        }
        if (!Objects.equals(this.personalCard, other.personalCard)) {
            return false;
        }
        return true;
    }

}

First I save the Project. It works fine. Then i want to connect it using project_function - so I create project_function set them existing project and personal_card and after trying to persist I get following error:

Caused by: org.postgresql.util.PSQLException: ERROR: column projectfun0_.personalcard does not exist
  Position: 8
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:561)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:419)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:304)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)
    ... 119 more

So apparently Hibernate does not know projectfun0_.personalcard . But I dont know why. Do you see any error in the entity classes? Or could the error possibly be somewhere else ?

Thank you very much for all your answers :)

Upvotes: 0

Views: 1308

Answers (1)

Predrag Maric
Predrag Maric

Reputation: 24433

EmbeddedId documentation

Relationship mappings defined within an embedded id class are not supported.

So, ProjectFunctionPK should contain only basic mappings, and entity mappings should be done in the entity itself. Here are some related posts

https://stackoverflow.com/a/9760808/4074715
https://stackoverflow.com/a/4692144/4074715

Upvotes: 1

Related Questions