题
我仍然在学习如何使用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当我尝试调用在用户表中选择。然而,当我拿出来Course类的引用在用户课堂上的一切工作完全正常。
所讨论的行是在我的DAO类。也许实体管理器无法初始化。下面的代码。
Query query = Stripersist.getEntityManager().createQuery(getQuery(fieldName, null)).setParameter(fieldName, value);
的createQuery()只是返回:
String query = "FROM " + entityClass.getName() + " t WHERE t." + fieldName + " = :" + fieldName;
我使用的条纹框架,Hibernate和Stripersist如果提供任何进一步的线索,什么是错的。
解决方案
从一乍一看,这似乎是你应该写:
@OneToMany(mappedBy="user")
private Collection<Course> courses;
我。即在@OneToMany 的mappedBy 应指向字段,它指向当前对象。
其他提示
的mappedBy表明,在这一侧的实体的关系是的逆,以及所有者在驻留“其他”的实体。在你的情况下,作为axtavt回答应该是:
@OneToMany(mappedBy="user")
private Collection<Course> courses;
指出用户可以选择很多课程和课程是承载这个关系的所有权。
不隶属于 StackOverflow