Hibernate получение списка из onetomany - PullRequest
1 голос
/ 08 сентября 2010

Мне удалось (как вы можете видеть из моих старых постов) вставить однокомантическое отношение через hibernate. Мои два класса сущностей выглядят следующим образом:

Project.java:

@Entity
public class Project {

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private int id; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy="project")
    @OrderColumn(name = "project_index")
    List<Application> applications;
....

Application.java (который является дочерним элементом проекта. Один проект может иметь несколько приложений, но одно приложение относится только к одному проекту)

@Entity
public class Application {

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private int id;
    @ManyToOne
    @JoinColumn(name = "project_id")
    private Project project;
...

Пока что вставка данных работает хорошо. Но проблема с получением данных из моей базы данных. Я пробовал два способа:


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

alt text

На самом деле этот способ работает! Я сделал несколько ошибок где-то еще ...


Способ 2: Я пытаюсь получить список всех приложений с помощью SQL-запроса:

public List<Application> getApplications(int project_id) {
  Session session = HibernateUtil.getSessionFactory().getCurrentSession();
  session.beginTransaction();
  List<Application> applications = session.createQuery("from Application a where a.project_id=" + project_id + " ").list();
  return applications;
 }

.. который выдает странное исключение -.-

org.hibernate.QueryException: не удалось разрешить свойство: идентификатор_проекта: de..common.entities.Application [from de..common.entities.Application a where a.project_id=1 ]

Проблема способа 2 заключается в том, что я смешиваю SQL и HQL.


Небольшая помощь новичку в спящем состоянии была бы отличной :-) Приветствия ..

Ответы [ 3 ]

4 голосов
/ 08 сентября 2010

Вы можете получить доступ к приложениям просто:

List<Application> applications = project.getApplications();

PersistentBag реализует java.util.List, поэтому вам не нужно заботиться о его внутренностях.

Для этого вам просто понадобится открытая сессия, в противном случае будет выдан LazyInitializationException.

2 голосов
/ 09 сентября 2010

Я пытаюсь получить список всех приложений с помощью SQL-запроса (...), который выдает странное исключение

Исключение не является странным и точно говорит вам, что не так: Application не имеет никакого свойства project_id, которое имеет значение true (project_id является столбцом базы данных).

Ваш запрос не является запросом SQL , это запрос JPQL . JPQL-запросы выполняются против сущностей (объектов) и их ассоциаций. Так что нужно думать об объектах и ​​ассоциациях.

В вашем случае (при условии, что у вас уже нет экземпляра Project, а есть только проект id), вы можете сделать что-то вроде этого:

Query q = session.createQuery("FROM Application a WHERE a.project.id = :id");
q.setParameter("id", project_id);
List<Application> applications = (List<Application>) q.list();
1 голос
/ 08 сентября 2010

Для способа 1: я не знаю о StoredSnapshot, но попробуйте установить FetchType для списка приложений в «EAGER». Может быть, это все исправит.

Для способа 2: вы создаете запрос к своей модели данных, а не к базе данных. Таким образом, поля должны быть полями в вашем отображении Java. В этом случае:

List applications = session.createQuery("from Application a where a.project=" + project).list();

Обратите внимание, что параметр, передаваемый в функцию, должен иметь тип Project, а не тип int.

Также, используя именованный запрос, вы можете сделать это:

 @NamedQuery(name="projectById",
             query="SELECT p FROM Project p"
                  + " LEFT JOIN FETCH applications"
            )
...