Исключение LazyInitializationException в методе hashCode()

#java #hibernate

#Ява #зимовать

Вопрос:

Не мог бы кто-нибудь, пожалуйста, помочь мне в следующем. Существуют Родительские, Дочерние и Внучатые сущности. Все они находятся в двунаправленных отношениях друг с другом .

Parent.java

 @OneToMany(mappedBy = "child", cascade = CascadeType.ALL, targetEntity = Child.class, orphanRemoval = true) private Setlt;Childgt; children = new HashSetlt;gt;();  

Child.java

 @ManyToOne(targetEntity = Parent.class) @JoinColumn(name = "parent_id") private Parent parent;   @OneToMany(mappedBy = "grandchild", cascade = CascadeType.ALL, targetEntity = Grandchild.class, orphanRemoval = true) private Setlt;Grandchildgt; grandchildren = new HashSetlt;gt;();  

Grandchild.java

 @ManyToOne(targetEntity = Child.class) @JoinColumn(name = "child_id") private Child child;  

Дочерний класс имеет методы equals и hashCode, которые зависят от внуков наряду с другими полями (идентификатор не является его частью).

Существует компонент с методом getFamily, аннотированным как @Transactional, который вызывает метод CrudRepositorylt;Родительский, длинныйgt; с запросом

 @Query("select p from Parent p join fetch p.children ch join fetch ch.grandchildren gch")   

при выполнении этого запроса вызывается хэш-код ребенка (). Для этого вызова hashCode() значение набора granchildren не может оценить метод выражения, который бросил ‘org.hibernate.Исключение исключения LazyInitializationException.

Метод getFamily имеет сеанс. Если вызвать запрос типа @Query(«выберите p из родительского»), а затем getChildren() для результирующей коллекции — все работает. А также просмотр детей, внуков в отладчике.

Я планирую заменить Наборы для Детей и Внуков соответствующими Списками, в качестве рекомендателя для двунаправленной модели по соображениям производительности, что также решает проблему. Тем не менее, я был бы очень признателен, если бы кто-нибудь мог объяснить, почему в этом случае сеанс не распространяется на методы сущностей (независимо от того, получают ли они дочерние элементы в запросе) и есть ли лучший способ решить эту проблему.

Комментарии:

1. Урок должен быть ограничен хэш-кодом и равен бизнес-ключу объекта, и в нем не должно быть детей. Во многих ситуациях вы можете прекрасно справляться с использованием равных и хэш-кода, предоставленного java.lang. Объект.

2. @NathanHughes, equals и хэш-код необходимы в случае этих сущностей, для sad. Рассмотрим подход, основанный на бизнес-ключах. Спасибо.