HashSet.addAll(来自存储库查询的列表)导致 InvalidDataAccessApiUsageException

HashSet.addAll( list from repository query ) causes InvalidDataAccessApiUsageException

我有以下代码:

HashSet hashSet = new HashSet(); 
                     hashSet.addAll(partnerRepository.findByVatNumber(partner));
hashSet.addAll(etc...);

我遇到以下异常:

org.springframework.dao.InvalidDataAccessApiUsageException: 
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: enone.domain.PartnerEntity; nested exception is java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: domain.PartnerEntity
        at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:381)
        at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:157)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
        at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
        at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:111)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
        at com.sun.proxy.$Proxy75.findByVatNumberExcludingPartner(Unknown Source)

我怀疑这可能与延迟加载有关?虽然这有点奇怪,因为我没有调用保存方法,只是将结果添加到哈希集中。

解释?

事实证明问题与实际的 HashSet 完全无关,而是与存储库有关。

我不是在比较合作伙伴的 ID,而是在比较合作伙伴与合作伙伴。 partnerEntity 虽然有延迟加载的字段,而且来自另一个 session/query.

我替换了这个:

@Query("select p from PartnerEntity p where p.country = ?1 AND NOT p.id = ?2")
    List<PartnerEntity> findByCountryNameExcludingPartner(CountryEntity country, PartnerEntity partnerEntity);

有了这个:

@Query("select p from PartnerEntity p where p.country = ?1 AND NOT p.id = ?2")
List<PartnerEntity> findByCountryNameExcludingPartner(CountryEntity country, Integer partnerEntity);

现在可以正常使用了。同样在通话中,我发送 partnerEntity.getId() 而不是整个实体。