#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. Рассмотрим подход, основанный на бизнес-ключах. Спасибо.