简体   繁体   English

Hibernate持久性:找不到列

[英]Hibernate persistence: Column not found

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 . 我需要生成一个引用UserProjectTask列表。 I am using h2 database. 我正在使用h2数据库。

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: 这是DAO类:

@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: 这是User类,我已经按照相同的原理映射了Project类:

@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: 最后一类是Task类:

@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 我认为我已经发布了所有相关信息,但是如果需要其他信息,我会很乐意添加

Your Task entity has a List<User> , that expects your User to have a @ManyToOne relationship. 您的Task实体具有List<User> ,该List<User>期望您的User具有@ManyToOne关系。

However, your table TASK.PROJECT_TASK has an FK to the TASK.APP_USER table. 但是,表TASK.PROJECT_TASKTASK.APP_USER表具有FK。 Meaning, the Task has a @ManyToOne relationship to the User, not the other way around. 意思是,任务与用户具有@ManyToOne关系,而不是相反。

You mappings are incorrect taking your table descriptions as the source of truth. 您的表描述作为事实的来源,您的映射是不正确的。

  1. The relationship from project to task should be OneToMany and not ManyToOne. 从项目到任务的关系应该是OneToMany,而不是ManyToOne。
  2. Likewise the relationship from task to project should be ManyToOne and not OneToMany 同样,从任务到项目的关系应该是ManyToOne而不是OneToMany
  3. The relationship between task and user should be ManyToOne and not OneToMany 任务和用户之间的关系应该是ManyToOne而不是OneToMany

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM