Kenci
Kenci

Reputation: 4882

Annotating a ManyToMany relationship: ERROR: Unknown column in 'field list'

I have looked at some different tutorials on how to annotate a ManyToMany relationship.

The error that I am getting when trying to return a list of areas on a user is: ERROR: Unknown column 'areadao1_.idArea' in 'field list'

The issue is similar to this post: Hibernate: Unknown column in field list, but the post doesnt give me any answers.

The model: enter image description here

So I have areas and users. Each area can have users, or each user can have areas. The naming of the mapping table and columns was auto-generated by mysql workbench.

Here is how my annotated classes look like:
AreaDAO.java:

@Entity
@Table(name= "area")
public class AreaDAO {

    private int idArea;
    private String areaName;
    private AreaDAO parent;

    private Set<UserDAO> users = new HashSet<UserDAO>();

    @Id
    @Column(name="idArea")
    @GeneratedValue
    public int getIdArea() {
        return idArea;
    }
    public void setIdArea(int idArea) {
        this.idArea = idArea;
    }

    @Column(name="areaName")
    public String getAreaName() {
        return areaName;
    }
    public void setAreaName(String areaName) {
        this.areaName = areaName;
    }

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="parent", referencedColumnName="idArea")
    public AreaDAO getParent() {
        return parent;
    }
    public void setParent(AreaDAO parent) {
        this.parent = parent;
    }

    @ManyToMany
    @JoinTable(name="area_has_user", 
                joinColumns={@JoinColumn(name="area_idAarea", referencedColumnName="idArea")}, 
                inverseJoinColumns={@JoinColumn(name="user_idUser", referencedColumnName="idUser")})
    public Set<UserDAO> getUsers() {
        return users;
    }
    public void setUsers(Set<UserDAO> users) {
        this.users = users;
    }
    public AreaDAO(int idArea, String areaName, AreaDAO parent) {
        super();
        this.idArea = idArea;
        this.areaName = areaName;
        this.parent = parent;
    }
    public AreaDAO() {
        super();
    }
}

UserDAO.java:

@Entity
@Table(name= "user")
public class UserDAO {


    private int idUser;
    private String username;
    private String password;

    private Set<AreaDAO> areas = new HashSet<AreaDAO>();

    @Id
    @Column(name="idUser")
    @GeneratedValue
    public int getIdUser() {
        return idUser;
    }
    public void setIdUser(int idUser) {
        this.idUser = idUser;
    }

    @Column(name="userName")
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

    @Column(name="userPassword")
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public UserDAO(int idUser, String username, String password) {
        super();
        this.idUser = idUser;
        this.username = username;
        this.password = password;
    }
    public UserDAO() {}

    @ManyToMany
    @JoinTable(name="area_has_user", 
                joinColumns={@JoinColumn(name="user_idUser", referencedColumnName="idUser")}, 
                inverseJoinColumns={@JoinColumn(name="area_idAarea", referencedColumnName="idArea")})
    public Set<AreaDAO> getAreas() {
        return areas;
    }
    public void setAreas(Set<AreaDAO> areas) {
        this.areas = areas;
    }
}

Where am I doing it wrong?

Edit per @JB Nizet's comments:

I removed the mapping on the AreaDAO and added:

@ManyToMany(mappedBy="areas")
    public Set<UserDAO> getUsers() {
        return users;
    }

The code that is causing the error is:

@Override
    public Set<AreaDAO> getAreas(UserDAO user) {

        Set<AreaDAO> areas = new HashSet<AreaDAO>();

        user.setUsername("admin_vejle");

        try {           
            Session session = createSessionFactory().openSession();

            Query query = session.createQuery("from UserDAO where username = :username");
            query.setParameter("username", user.getUsername());
            UserDAO result = (UserDAO)query.uniqueResult();
            if(result != null)
            {
                areas = result.getAreas();
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return areas;
    }

More specifically at the getAreas method.

When inspecting the result in Debugging mode, Hibernate will output:

Hibernate: select areas0_.user_idUser as user_idU1_3_0_, areas0_.area_idAarea as area_idA2_1_0_, areadao1_.idArea as idArea1_0_1_, areadao1_.areaName as areaName2_0_1_, areadao1_.parent as parent3_0_1_, areadao2_.idArea as idArea1_0_2_, areadao2_.areaName as areaName2_0_2_, areadao2_.parent as parent3_0_2_ from area_has_user areas0_ inner join area areadao1_ on areas0_.area_idAarea=areadao1_.idArea left outer join area areadao2_ on areadao1_.parent=areadao2_.idArea where areas0_.user_idUser=?
mar. 08, 2015 12:31:55 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1054, SQLState: 42S22
mar. 08, 2015 12:31:55 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Unknown column 'areadao1_.idArea' in 'field list'

Also, a similar exception will be thrown if trying to access the object.

I will let the naming of DAO's be for now.

Upvotes: 2

Views: 1366

Answers (1)

Kenci
Kenci

Reputation: 4882

The table area has the column "idAarea". There are two a's in the name: Aarea

I was only using one A in my mappings.

This caused the error.

Upvotes: 1

Related Questions