当前位置: 首页 > news >正文

failed to lazily initialize a collection of role,解决Hibernate查询报错

Hibernate报错:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.jiuqi.gov.common.attatchment.entity.AttachmentEntity.properties, could not initialize proxy - no Session
        at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:614) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:218) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:162) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.collection.internal.PersistentMap.size(PersistentMap.java:148) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at java.util.HashMap.putMapEntries(HashMap.java:502) ~[?:1.8.0_381]
        at java.util.HashMap.<init>(HashMap.java:491) ~[?:1.8.0_381]
        at com.jiuqi.gov.common.attatchment.entity.AttachmentEntity.toAttachmentInfo(AttachmentEntity.java:293) ~[common.attachment-1.5.1.jar:?]

原代码:

public List<AttachmentInfo> getAttachmentById(UUID id){String table = "com.fdw.AttachmentEntity";List<AttachmentInfo> result = new ArrayList<>();List<AttachmentEntity> resultList = template.execute(new HibernateCallback<List<AttachmentEntity>>() {@Overridepublic List<AttachmentEntity> doInHibernate(Session session) throws HibernateException {String sql = "from " + table + " where Id = :id";Query<AttachmentEntity> query = session.createQuery(sql, AttachmentEntity.class);query.setParameter("id", id);return query.getResultList();}});for (AttachmentEntity attachmentEntity : resultList){result.add(attachmentEntity.toAttachmentInfo());}return result;}

问题原因:

 AttachmentEntity 类有个懒加载的字段 properties,关联了其他表。

关于懒加载

所谓懒加载(lazy)就是延时加载,延迟加载。即不是不加载,而是在需要的时候才加载。

什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载。

至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,

因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,

我们让数据在需要的时候才进行加载,这时我们就用到了懒加载。

比如部门ENTITY和员工ENTITY,部门与员工1对多,

如果lazy设置为 false,那么只要加载了一个部门的po,就会根据一对多配置的关系把所有员工的po也加载出来。

但是实际上有时候只是需要用到部门的信息,不需要用到 员工的信息,这时员工po的加载就等于浪费资源。如果lazy设置为true,那么只有当你访问部门po的员工信息时候才回去加载员工的po的信息。

hibernate3.0 中 lazy有三个值:

lazy有三个属性:true、false、extra

【true】:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据 。即只有在使用的时候才发出查询命令。

【false】:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据即加载对象的时候就发出查询语句,加载关联的子类数据。


【extra】:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据

 

 

解决后代码:

public List<AttachmentInfo> getAttachmentById(UUID id){String table = "com.fdw.AttachmentEntity";List<AttachmentInfo> result = new ArrayList<>();template.execute(new HibernateCallback<List<AttachmentEntity>>() {@Overridepublic List<AttachmentEntity> doInHibernate(Session session) throws HibernateException {String sql = "from " + table + " where Id = :id";Query<AttachmentEntity> query = session.createQuery(sql, AttachmentEntity.class);query.setParameter("id", id);List<AttachmentEntity> resultList = query.getResultList();for (AttachmentEntity attachmentEntity : resultList){result.add(attachmentEntity.toAttachmentInfo());}return null;}});return result;}

http://www.lryc.cn/news/391250.html

相关文章:

  • Promethuse-监控 Etcd
  • linux桌面运维---第四天
  • 视频网关的作用
  • css+js实现导航栏色块跟随滑动+点击后增加样式
  • AudioLM音频生成模型:技术革新与应用前景
  • 数据结构教材关于C/C++的研究
  • 【刷题笔记(编程题)05】另类加法、走方格的方案数、井字棋、密码强度等级
  • 如何检查购买的Facebook账号优劣?
  • 2.2.1 ROS2案例以及案例分析
  • 使用 Python 访问 Windows 剪贴板
  • 手机空号过滤的多种应用场景
  • [Vue学习]生命周期及其各阶段举例
  • YOLOv5改进 | 损失函数 | EIoU、SIoU、WIoU、DIoU、FocuSIoU等多种损失函数
  • [leetcode]minimum-absolute-difference-in-bst 二叉搜索树的最小绝对差
  • [ALSA]从零开始,使用ALSA驱动播放一个音频
  • 自动化设备上位机设计 一
  • tampermonkey插件下载国家标准文件
  • JAVA学习笔记2
  • Unity 解包工具(AssetStudio/UtinyRipper)
  • log4j2 对定时异步线程打印的日志进行过滤
  • Oracle内部bug导致的19c DG备库宕机
  • 2024 世界人工智能大会暨人工智能全球治理高级别会议全体会议在上海举办,推动智能向善造福全人类
  • 【算法专题--栈】用栈实现队列 -- 高频面试题(图文详解,小白一看就懂!!)
  • 2024亚太杯中文赛B题全保姆教程
  • 穿越光影,共赏中华瑰宝——皮影戏文化交流盛会
  • SQL常用经典语句大全
  • 黑马点评DAY5|商户查询缓存
  • Owl 中的 Props 概述
  • 【大数据综合试验区1008】揭秘企业数字化转型:大数据试验区政策数据集大公开!
  • 在 WebGPU 与 Vulkan 之间做出正确的选择(Making the Right Choice between WebGPU vs Vulkan)