Reputation: 265
I am getting Column not found error during, and I can't figure out what is wrong, so I ask for help.
I need to generate a list of Task
that references User
and Project
.
I am using h2 database.
Here are the tables:
CREATE TABLE TASK.APP_USER (
id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
username VARCHAR(25) NOT NULL,
firstName VARCHAR(25) NOT NULL,
lastName VARCHAR(25) NOT NULL,
password VARCHAR(32) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE TASK.PROJECT (
id INT GENERATED ALWAYS AS IDENTITY,
name VARCHAR(50) NOT NULL,
companyName VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE TASK.PROJECT_TASK (
id INT GENERATED ALWAYS AS IDENTITY,
projectId INT NOT NULL,
userId INT NOT NULL,
description VARCHAR(500) NOT NULL,
estimatedDurationHours INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (projectId) REFERENCES TASK.PROJECT(id),
FOREIGN KEY (userId) REFERENCES TASK.APP_USER(id),
);
Here is the DAO class:
@Repository
public class TaskDaoHibernate implements TaskDao {
public TaskDaoHibernate() {
}
@Autowired
private SessionFactory sessionFactory;
private Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
@SuppressWarnings("unchecked")
@Override
public List<User> fetchAllUsers() {
return getCurrentSession().createQuery("from User").list();
}
@Override
public User fetchUserById(Integer userId) {
return (User) getCurrentSession().get(User.class, userId);
}
@SuppressWarnings("unchecked")
@Override
public List<Project> fetchAllProjects() {
return getCurrentSession().createQuery("from Project").list();
}
@Override
public Project fetchProjectById(Integer projectId) {
return (Project) getCurrentSession().get(Project.class, projectId);
}
@Override
public void saveTask(Task task) {
getCurrentSession().save(task);
}
@SuppressWarnings("unchecked")
@Override
public List<Task> fetchAllTasks() {
return getCurrentSession().createQuery("from Task").list();
}
@Override
public Task fetchTaskById(Integer taskId) {
return (Task) getCurrentSession().get(Task.class, taskId);
}
@Override
public void editTask(Task task) {
getCurrentSession().update(task);
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
Here is the User class, I've mapped Project class on same principle:
@Entity
@Table(name="TASK.PROJECT")
public class Project implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
@GeneratedValue
private Integer id;
@Column(name = "NAME")
private String nazivProjekta;
@Column(name = "COMPANYNAME")
private String nazivTvrtke;
@ManyToOne
@JoinColumn(name="PROJECTID")
private Task task;
//setters, getters and overrided equal and hashcode methods
And last class is the Task class:
@Entity
@Table(name="TASK.PROJECT_TASK")
public class Task implements Serializable {
/**
*
*/
private static final long serialVersionUID = -4633753821563474175L;
@OneToMany(mappedBy="id", fetch=FetchType.EAGER)
private List<User> user;
@OneToMany(mappedBy="id", fetch=FetchType.EAGER)
private List<Project> project;
@Column(name = "DESCRIPTION ")
private String opisZadatka;
@Column(name = "ESTIMATEDDURATIONHOURS")
private Integer trajanje;
@Id
@Column(name = "ID")
@GeneratedValue
private Integer id;
public Task(){
}
And here is the beggining of stack trace:
org.h2.jdbc.JdbcSQLException: Column "USER0_.USERID" not found; SQL statement:
select user0_.ID as ID1_2_0_, user0_.ID as ID1_0_0_, user0_.ID as ID1_0_1_, user0_.FIRSTNAME as FIRSTNAM2_0_1_, user0_.USERNAME as USERNAME3_0_1_, user0_.LASTNAME as LASTNAME4_0_1_, user0_.USERID as USERID5_0_1_, task1_.ID as ID1_2_2_, task1_.DESCRIPTION as DESCRIPT2_2_2_, task1_.ESTIMATEDDURATIONHOURS as ESTIMATE3_2_2_ from TASK.APP_USER user0_ left outer join TASK.PROJECT_TASK task1_ on user0_.USERID=task1_.ID where user0_.ID=? [42122-176]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
at org.h2.message.DbException.get(DbException.java:178)
at org.h2.message.DbException.get(DbException.java:154)
I think that I've posted all relevant info, but if something else is needed, I will gladly add it
Upvotes: 0
Views: 5531
Reputation: 1261
You mappings are incorrect taking your table descriptions as the source of truth.
Upvotes: 1
Reputation: 386
Your Task
entity has a List<User>
, that expects your User
to have a @ManyToOne relationship.
However, your table TASK.PROJECT_TASK
has an FK to the TASK.APP_USER
table. Meaning, the Task has a @ManyToOne relationship to the User, not the other way around.
Upvotes: 1