2015-07-10 40 views
0

我在獲取Column時未發現錯誤,並且我無法弄清楚什麼是錯誤的,因此我尋求幫助。Hibernate持久性:列未找到

我需要生成一個列表Task,其中引用UserProject。 我正在使用h2數據庫。

下面是表:

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), 
); 

下面是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; 
} 


} 

這裏是同樣的原理User類,我已經規劃項目類:

@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 

最後一類是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(){ 

} 

這裏是堆棧跟蹤的beggining:

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) 

我認爲我已經發布的所有相關信息,但如果需要別的東西,我會很樂意將其添加

+0

當您使用實體,每列將被映射到一個變量。你在'Task'類中有'List '用戶,但是你沒有列名:'userid',Hibernate不能引用它。 –

+0

謝謝你的回答。我添加了annunci @Column(name =「USERID」)列,但我仍然遇到同樣的問題 – Sarpy

回答

1

Task實體有一個List<User>,期望您的User有@ManyToOne關係。

但是,您的表TASK.PROJECT_TASK有一個FK到TASK.APP_USER表。意思是,任務與用戶有一個@ManyToOne關係,而不是相反。

1

你的映射是不正確的把你的表格描述作爲真相的來源。

  1. 從項目到任務的關係應該是OneToMany而不是ManyToOne。
  2. 同樣,從任務到項目關係應該是多對一,而不是一對多
  3. 任務和用戶之間的關係應該是多對一,而不是一對多
+0

謝謝你的回答,我意識到我做錯了,所以你和http://stackoverflow.com/用戶/ 2433751/sekkuar是正確的。我已經完成了這一步,但我現在停留在ObjectNotFoundException。我會爲此發佈另一個問題。謝謝你的幫助 – Sarpy