Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate惰性加载是递归加载集或引用数据_Java_Spring_Hibernate_Recursion_Lazy Loading - Fatal编程技术网

Java Hibernate惰性加载是递归加载集或引用数据

Java Hibernate惰性加载是递归加载集或引用数据,java,spring,hibernate,recursion,lazy-loading,Java,Spring,Hibernate,Recursion,Lazy Loading,我在Hibenate延迟加载方面遇到了一些奇怪的问题。我有两个实体ProcessEntity和SectionEntity。ProcessEntity可以有许多SectionEntity,SectionEntity应该知道它属于@OneToMany的ProcessEntity。我遇到的问题是,当我加载带有hibernateTemplate.getid的ProcessEntity,然后调用我的自定义函数fetchLazyCollectionsentity。。。它循环entities方法,直到找到Pe

我在Hibenate延迟加载方面遇到了一些奇怪的问题。我有两个实体ProcessEntity和SectionEntity。ProcessEntity可以有许多SectionEntity,SectionEntity应该知道它属于@OneToMany的ProcessEntity。我遇到的问题是,当我加载带有hibernateTemplate.getid的ProcessEntity,然后调用我的自定义函数fetchLazyCollectionsentity。。。它循环entities方法,直到找到PersistentCollection,然后强制对该方法进行延迟加载

当ProcessEntity加载了其设置lazy时,它递归加载SectionEntity中的所有数据,这意味着它加载了ProcessEntity,该ProcessEntity加载了SectionEntity,该ProcessEntity加载了ProcessEntity,依此类推!当我尝试序列化数据时,这会导致堆栈溢出,这对性能来说一定很糟糕。当我进行HQL查询等时,不会发生这种情况

以下是我对实体的设置:

ProcessEntity:

@javax.persistence.Entityname=进程 公共类ProcessEntity扩展实体{ @身份证 @GeneratedValuestrategy=GenerationType.IDENTITY private int id=Entity.UNSAVED_id; ... @OneToManyfetch=FetchType.LAZY,mappedBy=process 私有集节=新哈希集; ... 公共集getSections{ 回流段; } 公共无效集合部分集合部分{ 本节=节; } ... } 部门实体:

@javax.persistence.Entityname=节 公共类SectionEntity扩展实体{ @身份证 @GeneratedValuestrategy=GenerationType.IDENTITY private int id=Entity.UNSAVED_id; ... @ManyToneFetch=FetchType.LAZY,targetEntity=ProcessEntity.class @JoinColumnname=进程,ReferenceColumnName=id 私有进程实体进程; @凌驾 公共整数getId{ 返回此.id; } 公共无效设置id{ this.id=id; } ... 公共进程实体getProcess{ 返回过程; } 公共无效setProcessProcessEntity进程{ 这个过程=过程; } ... } fetchLazyCollections:

公共E fetchLazyCollectionsE实体,字符串。。。指定集合{ ifgetCurrentSession==null{ 抛出新SessionException未找到用于获取集合的会话。; } //使用反射获取集合 类returnType=method.getReturnType; IfReflectils.isClassCollectionreturnType{ //检查集合类型是否通过getter指定 指定的列表=Arrays.asListspecifiedCollections; 如果指定了!则为空{ 如果指定了!containsmethod.getName{ 持续 } } 试一试{ //检查集合是否持久 集合集合=集合方法。invokeentity; PersistentCollection的ifcollection实例{ collection.size;//调用延迟加载 } } 捕获非法访问例外|非法访问例外 |调用目标异常{ e、 打印跟踪; } } } 返回实体; } 我在后端使用Spring,使用@Transactional。以下是我的Hibernate spring模块@配置:

@配置 @进口{ MappingModule.class } @ImportResourceclasspath:nz/co/doltech/ims/properties.xml @启用事务管理 公共类HibernateModule{ 私有静态int统计量=0; private@Value{app['root.path']}字符串projectPath; private@Value{app['database.jndiname']}字符串databaseJndiName; private@Value{app['hibernate.dial']}字符串hibernateDialect; private@Value{app['hibernate.hbm2ddl']}字符串hibernateHbm2dll; private@Value{app['hibernate.show_sql']}字符串hibernateShowSql; private@Value{app['hibernate.format_sql']}字符串hibernateFormatSql; private@Value{app['hibernate.generate_statistics']}字符串hibarnateStatistics; private@Value{app['hibernate.cache.provider_class']}字符串hibarnateCacheProviderClass; private@Value{app['hibernate.cache.use_query_cache']}字符串hibarnateQueryCache; private@Value{app['hibernate.cache.use_second_level_cache']}字符串hibarnateSecondLevelCache; private@Value{app['hibernate.cache.use_structured_entries']}字符串hibernateStructuredEntries; private@Value{app['net.sf.ehcache.configurationResourceName']}字符串hibernateEhcacheResource; private@Value{app['flyway.enabled']}字符串flywayEnabled; private@Value{app['flyway.basePath']}字符串flywayBasePath; @Beanname=数据源 公共JndiObjectFactoryBean GetDriverManager数据源{ JndiObjectFactoryBean数据源=新的JndiObjectFactoryBean; dataSource.setJndiNamedatabaseJndiName; dataSource.setCachetrue; 返回数据源; } @Beanname=会话工厂 @DependsOn{dataSource,flyway} 公共注释SessionFactoryBean getAnnotationSessionFactoryBean{ AnnotationSessionFactoryBean sessionFactory=新的AnnotationSessionFactoryBean; sessionFactory.setDataSourceDataSource getDriverManagerDataSource.getObject; sessionFactory.setPackagesToScannew字符串[]{ projectPath+.server.entities, projectPath+.server.entities.joins }; 属性道具=新属性; props.setPropertyhibernate.dialogue,hibernateDialect; props.setPropertyhibernate.show_sql,hibernateShowSql; props.setPropertyhibernate.hbm2ddl.auto,hibernateHbm2dll; props.setPropertyhibernate.format_sql,hibernateFormatSql; props.setPropertyhibernate.generate_statistics、hibarnateStatistics; props.setPropertyhibernate.cache.provider_类,hibarnateCacheProviderClass; props.setPropertyhibernate.cache.use_query_cache,hibarnateQueryCache; props.setPropertyhibernate.hibernate.cache.provider\u配置\u文件\u资源\u路径,hibernateEhcacheResource; props.setPropertyhibernate.use_second_level_cache,HiBarnateSond levelcache; props.setPropertyhibernate.cache.use_structured_条目,hibernateStructuredEntries; props.setPropertyjavax.persistence.validation.mode,无; //缓存资源 //props.setPropertynet.sf.ehcache.configurationResourceName,hibernateEhcacheResource; //props.setPropertyhibernate.transaction.manager_lookup_class,nz.co.doltech.ims.server.persistence.TransactionManagerLookup; //props.setPropertyhibernate.transaction.factory_类,org.hibernate.transaction.JTATransactionFactory; sessionFactory.setHibernateProperties道具; 返回工厂; } @Beanname=transactionManager @依赖会话工厂 公共HibernateTransactionManager getHibernateTransactionManager{ HibernateTransactionManager transactionManager=新的HibernateTransactionManager; transactionManager.setSessionFactorygetAnnotationSessionFactoryBean.getObject; 返回事务管理器; } @Beanname=hibernateTemplate @依赖会话工厂 公共HibernateTemplate getHibernateTemplate{ HibernateTemplate HibernateTemplate=新的HibernateTemplate; hibernateTemplate.setSessionFactorygetAnnotationSessionFactoryBean.getObject; 返回hibernateTemplate; } @Beanname=jmxExporter @依赖于HibernateStatisticsBean 公共MBeanExporter getJmxExporter{ MBeanExporter exporter=新的MBeanExporter; Map Map=新的HashMap; Properties props=AppProperties.getProperties; 字符串名称=props.getPropertyAppProperties.CLIENT\u模块\u名称; 字符串类型=props.getPropertyAppProperties.CLIENT\u RELEASE\u STAGE; map.putHibernate:+name++[+++统计+]-+type+=Statistics, getHibernateStatisticsBean; exporter.setBeansmap; 退货出口商; } @Beanname=hibernatestisticsbean 公共统计服务getHibernateStatisticsBean{ StatisticsService statsBean=新的统计服务; statsBean.setStatisticsEnabledtrue; statsBean.setSessionFactorygetAnnotationSessionFactoryBean.getObject; 返回statsBean; } @Beanname=incidentDao @依赖于冬眠 公共事故HibernateDao getIncidentDao{ IncidentHibernateDao incidentDao=新的IncidentHibernateDao; //incidentDao.registerBroadcasterIdAtmosphereConst.UPDATE_ID_KEY; 意外退货; } @Beanname=transactionTemplate @DependsOn{transactionManager} @示波器原型 公共事务模板getTransactionTemplate{ 返回新的TransactionTemplategetHibernateTransactionManager; } } 这是Hibernate输出:

hibernateDao.get(...) called:
Hibernate: select processent0_.id as id27_0_, processent0_.description as descript2_27_0_, processent0_.name as name27_0_, processent0_.nametoken as nametoken27_0_, processent0_.order_value as order5_27_0_, processent0_.removed as removed27_0_ from processes processent0_ where processent0_.id=?

hibernateDao.fetchLazyCollections(...) called:
Hibernate: select incidentjo0_.process_id as process3_27_1_, incidentjo0_.incident_id as incident2_1_, incidentjo0_.process_id as process3_1_, incidentjo0_.incident_id as incident2_21_0_, incidentjo0_.process_id as process3_21_0_, incidentjo0_.completed as completed21_0_ from incident_process incidentjo0_ where incidentjo0_.process_id=?
Hibernate: select sections0_.process as process27_1_, sections0_.id as id1_, sections0_.id as id29_0_, sections0_.description as descript2_29_0_, sections0_.name as name29_0_, sections0_.order_value as order4_29_0_, sections0_.process as process29_0_, sections0_.removed as removed29_0_ from sections sections0_ where sections0_.process=?
从那一点起,就不需要其他任何东西了

有人知道这里发生了什么吗?我没有主意了

谢谢你给我的任何帮助

干杯,
Ben

什么样的序列化,比如json?另外,递归加载意味着,您可以看到它实际上是递归地触发查询。当您使用双向映射并尝试调试和检查对象时,您会递归地看到引用,但实际上它不是递归的,它们只是对象引用。序列化不会影响这一点,对象会映射到DTO,因此不会调用hibernate代理。映射器适用于hibernate代理对象/集。当我调试时,我检查了hibernate调用,并将其添加到主帖子中。