1

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

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

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

@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 只考虑了每个表中的主键。这里有什么明显的错误吗?如果不是这样,那么调试此类问题的好方法是什么。

当我尝试在用户表上调用选择时收到 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,如果这提供了任何关于错误的进一步线索。

4

2 回答 2

1

乍一看,您似乎应该这样写:

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

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

于 2009-12-27T20:33:02.167 回答
0

mappedBy 表示这一侧的实体是关系的逆,所有者驻留在“其他”实体中。在您的情况下,axtavt 的回答应该是:

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

声明用户可以选择许多课程,并且课程拥有此关系的所有权。

于 2014-08-11T19:39:54.263 回答