我还在学习如何使用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,如果它提供了有关错误的任何进一步线索。
答案 0 :(得分:1)
从第一眼看,似乎应该写下:
@OneToMany(mappedBy="user")
private Collection<Course> courses;
予。即在@OneToMany中 mappedBy 应该指向指向当前对象的字段。
答案 1 :(得分:0)
mappedBy表示此方中的实体是关系的反转,并且所有者驻留在“其他”实体中。在你的情况下,作为axtavt回答应该是:
@OneToMany(mappedBy="user")
private Collection<Course> courses;
声明用户可以选择许多课程,而课程则拥有这种关系的所有权。