Я довольно новичок в JPA / Hibernate (Java в целом), поэтому мой вопрос заключается в следующем (обратите внимание, я искал далеко и широко и не нашел ответа на этот вопрос):
У меня естьдве сущности:
Родитель и дочерний элемент (имя изменено).
Родитель содержит список дочерних элементов и дочерних элементов относится к родителю.
например,
@Entity
public class Parent {
@Id
@Basic
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "PARENT_ID", insertable = false, updatable = false)
private int id;
/* ..... */
@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", nullable = true)
private Set<child> children;
/* ..... */
}
@Entity
public class Child {
@Id
@Basic
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CHILD_ID", insertable = false, updatable = false)
private int id;
/* ..... */
@ManyToOne(cascade = { CascadeType.REFRESH }, fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID")
private Parent parent;
/* ..... */
}
Я хочу иметь возможность сделать следующее:
Получить родительский объект, который будет содержать список всех его дочерних элементов (List), однако при перечислении Parent (получение List,он, конечно, должен исключить дочерние элементы из результатов, поэтому установите FetchType.LAZY.
Извлечь дочернюю сущность, которая будет содержать экземпляр родительской сущности.
Использование приведенного выше кода (или аналогичного) приводит к двум исключениям:
Извлечение родителя: в графе объектов обнаружен цикл. Это приведет к бесконечно глубокому XML ...
Получение ребенка: org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: xxxxxxxxxxx, ни один сеанс или сеанс не был закрыт
При получении родительского объекта я использую именованный запрос (т.е. вызываю его специально) @NamedQuery (name = "Parent.findByParentId", query = "SELECT p FROM Parent AS p LEFT JOIN FETCH p.children где p.id =: id")
Код для получения Parent (то есть уровня обслуживания):
public Parent findByParentId(int parentId) {
Query query = em.createNamedQuery("Parent.findByParentId");
query.setParameter("id", parentId);
return (Parent) query.getSingleResult();
}
Почему я получаю событие LazyInitializationException, хотя свойство List в родительском объекте установлено как Lazy (при получении дочернего объекта)?