EAGER и Pagination: Spring MVC + репозиторий JPA + Hibernate
У меня есть сущность А, которая имеет отношение @OneToMany
с сущностью B (fetch mode = EAGER)
, Объект А имеет другие отношения в LAZY и с другими объектами, но не имеет значения для этой проблемы.
Сущность B имеет отношение @ManyToOne
с сущностью А тоже (режим fech = EAGER). Сущность B имеет другие отношения в LAZY
с другими объектами тоже, но это не важно для этой проблемы.
Позже у меня есть интерфейс, который реализует класс JpaRepository, где я определяю @Query
с некоторыми внутренними объединениями между другими объектами для получения набора объектов A из 10 элементов с вычисленным счетом с использованием элементов Page и Pageable.
Вот этот процесс провалился. Зачем?
Моя таблица для объекта A в базе данных имеет +1000 регистров, которые имеют условия @query
, Но перед тем, как Hibernate или JPA вернут мне 10 сущностей A, внутренне представьте 1000+ вариантов для получения данных сущностей B (реализация EAGER) и использования.
почему не получают 10 сущностей A и exec 10 "выбирает" только для получения 10 сущностей B?
Уникальное решение - изменить мои отношения с EAGER на LAZY?? Вы не можете работать с EAGER?
Почему это произошло? любое решение?
РЕДАКТИРОВАТЬ: aclaration: +1000 entity A +1000 entityB (в моем примере один entity A только с одним entityB, но entity A может иметь несколько объектов B)
@Entity
@Table(name="EntityA")
public class EntityA implements Serializable{
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(columnDefinition = "BINARY(16)")
private UUID id;
@OneToMany(mappedBy="entityA", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@OrderBy("updatedDate DESC")
private Set<EntityB> entitiesB = new HashSet<EntityB>();
...
}
@Entity
@Table(name="EntityB")
public class EntityB implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(columnDefinition = "BINARY(16)")
private UUID id;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "idEntityA", nullable = false)
private EntityA entityA;
...
}
public interface EntityA_DAO extends JpaRepository<EntityA, UUID>{
@Query("SELECT DISTINCT a FROM EntityA a INNER JOIN a.entityB b LEFT JOIN b.scoreEntityB s INNER JOIN a.user u INNER JOIN a.properties p INNER JOIN p.category c " +
"WHERE c.cod IN (:codcats) AND a.user <> :user AND b.codState = '001' AND a.codState NOT IN ('002','004','005') AND p.deleted <> 1 " +
"GROUP BY b ORDER BY a.createdDate DESC, COUNT(s) DESC")
public Page<EntityA> findAllByCategories(@Param("user") User user, @Param("codcats") List<Integer> lstCodCats, Pageable pageable);
}
РЕДАКТИРОВАТЬ 2
это фрагмент моей ошибки трассировки, повторите и повторите то же самое:
в java.util.HashMap.put(неизвестный источник) в java.util.HashSet.add(неизвестный источник) в java.util.AbstractCollection.addAll(неизвестный источник) в org.hibernate.collection.internal.PersistentSet.endRead(PersistentSet.java:327) в org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:234) в org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections: atLad. hibernate.plan.exec.process.internal.AbstractRowReader.finishLoadingCollections(AbstractRowReader.java:249) в org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:212) в org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl. AbstractLoadPlanBasedLoader.java:86) в org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167) в org.hibernate.persister.entity.AbstractEntityht..event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) при org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) в org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) в org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:116) в org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) в org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129) в org.hibernate.internal.SessionImpl.immediateLoad(SessionImpl.java:997) в org.hibernate.LazinInbject. (AbstractLazyInitializer.java:157) в org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:266) в org.hibernate.proxy.pojo.javassist.model.Fragment_$$_jvsta55_10.hashCode(Фрагмент _$$_jvsta55_10.java) в com.treebuk.model.Fragment.hashCode(Fragment.java:210) в sun.reflect.GeneratedMethodAccessor111.invoke(неизвестный источник) в sun.ref.DelegatingMethodAccessorImpl.invoke(Неизвестный источник) в java.lang.reflect.Method.invoke(Неизвестный источник) в org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.mot.bra.rav):79 $$ _ jvsta55_10.hashCode (Фрагмент _$$_jvsta55_10.java) на com.treebuk.model.TextFragment.hashCode(TextFragment.java:340) в java.util.HashMap.hash(неизвестный источник) в java.util.HashMap.put(неизвестный источник) в java.util.HashSet.add(неизвестный источник) в java.util.AbstractCollection.addAll(неизвестный источник) в org.hibernate.collection.internal.PersistentSet.endRead (PersistentSet.java:327) в org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollection (CollectionLoavag2)..hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:221) в org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContenate.log.h):.process.internal.CollectionReferenceInitializerImpl.endLoading(CollectionReferenceInitializerImpl.java:154) в org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishLoadingCollections(AbstractRowReader.java:24iber.exeloc..process.internal.AbstractRowReader.finishUp (Abstra ctRowReader.java:212) в org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:123) в org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedBoLB java:122) at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86) в org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.Llang.Loader.LB) org).hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3956) в org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) в org.hiberternalLad.vent.vent.ovent (.java: 478) в org.hibernate.event.internal.DefaultLoadEventListener.load (DefaultLoadEventListener.java:219) в org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad (DefaultLoadEventListener. Java: 116) в org.hibernate.event.internal.DefaultLoadEventListener.onLoad (DefaultLoadEventListener.java:89) в org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129) в org.hibernate.mpad.Sim. (SessionImpl.java:997) в org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:157) в org.hibernate.proxy.AbstractLazyInitializer.getImplementation (AbstractLazyInitializer.jo.h.jpg: 66) javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:68) в com.treebuk.model.Fragment_$$_jvsta55_10.hashCode(Фрагмент _$$_jvsta55_10.java) в com.treebuk.moash.java.modelF at sun.reflect.GeneratedMethodAccessor111.invoke(неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke(неизвестный источник) в java.lang.reflect.Method.invoke(неизвестный источник) в org.hibernate.proxyistpoj.jav.jav.invoke(JavassistLazyInitializer.java:79) на com.treebuk.model.Fragm ent _ $$ _ jvsta55_10.hashCode (Фрагмент _$$_jvsta55_10.java) в com.treebuk.model.TextFragment.hashCode (TextFragment.java:340) в java.util.HashMap.hash(неизвестный источник)
1 ответ
Finnaly, я нашел проблему. Проблема была в том, что метод Entity B hasCode() состоял в том, что этот метод имел сравнение с Entity A, затем, когда Spring пытается получить элементы, выполняет метод hascode и вводится в бесконечный цикл. Я изменяю методы hascode () и equal() для удаления этих сравнений (в моем случае это не обязательно).