Вопрос

Я все еще учусь настраивать эти сопоставления с помощью аннотаций 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 из класса User, все работает отлично.

Рассматриваемая строка находится в моем классе DAO.Возможно, Entity Manager не может инициализироваться.Вот код.

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, если это дает дополнительные подсказки о том, что не так.

Это было полезно?

Решение

С первого взгляда кажется, что надо написать:

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

Я.е.в @OneToMany сопоставленоBy должно указывать на поле, которое указывает на текущий объект.

Другие советы

MappedBy указывает, что сущность на этой стороне является обратной по отношению к отношению, а владелец находится в «другой» сущности.В вашем случае ответ axtavt должен быть таким:

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

заявляет, что пользователь может выбрать множество курсов, и Курс является владельцем этого отношения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top