Reputation: 4882
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:
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
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