映射与Hibernate的关系

时间:2009-12-27 19:29:32

标签: java hibernate jpa stripes

我还在学习如何使用JPA注释设置这些映射,这可能是一个初学者的错误。

我有一个User类和一个Course类。在数据库中,每个课程在每行中都有一个用户外键(将用户视为教授课程的教师)。因此每个用户可以有多个课程,但每个课程只有一个用户。

在映射这些类时,我编写了以下代码:

@Entity
public class User extends BaseModel {

 @OneToMany(mappedBy="course")
 private Collection<Course> courses;

 public void setCourses(Collection<Course> courses) { this.courses = courses; }

 public Collection<Course> getCourses() { return courses; }

}

@Entity
public class Course extends BaseModel {

 @ManyToOne
 @JoinColumn(name="user_id")
 private User user;

 public void setUser(User user) { this.user = user; }

 public User getUser() { return user; }

}

我省略了不相关的字段,BaseModel只占每个表中的主键。 这里有什么明显的错误吗?如果没有什么是调试这样的问题的好方法。

当我尝试在用户表上调用select时,我收到NullPointerException。但是,当我在User类中取出对Course类的引用时,一切都运行得很好。

有问题的行在我的DAO课程中。也许实体管理器无法初始化。这是代码。

Query query = Stripersist.getEntityManager().createQuery(getQuery(fieldName, null)).setParameter(fieldName, value);

createQuery()只返回:

String query = "FROM " + entityClass.getName() + " t WHERE t." + fieldName + " = :" + fieldName;

我正在使用Stripes框架,Hibernate和Stripersist,如果它提供了有关错误的任何进一步线索。

2 个答案:

答案 0 :(得分:1)

从第一眼看,似乎应该写下:

@OneToMany(mappedBy="user") 
private Collection<Course> courses; 

予。即在@OneToMany中 mappedBy 应该指向指向当前对象的字段。

答案 1 :(得分:0)

mappedBy表示此方中的实体是关系的反转,并且所有者驻留在“其他”实体中。在你的情况下,作为axtavt回答应该是:

@OneToMany(mappedBy="user")
private Collection<Course> courses;

声明用户可以选择许多课程,而课程则拥有这种关系的所有权。