hibernate延迟加载代理对象实际对象读取方式

  1. public static <T> T deproxy (T obj) {
  2. if (obj == null)
  3. return obj;
  4. if (obj instanceof HibernateProxy) {
  5. // Unwrap Proxy;
  6. // -- loading, if necessary.
  7. HibernateProxy proxy = (HibernateProxy) obj;
  8. LazyInitializer li = proxy.getHibernateLazyInitializer();
  9. return (T) li.getImplementation();
  10. }
  11. return obj;
  12. }

所有解决的问题

当两个对象相互关联并使用懒加载时,从数据库中取出来使用时报错,通过调试查看对象所有字段的值为null;其中有个handle的对象,代表着为hibernater的缓存代理对象。但通过get\setXXX()有能得到该对象的字段值。但是 在不被get\setXXX()时获取原对象的类型时报错,提示 javax.persistence.EntityNotFoundException: Unable to find xxxxx

解决描述

在使用hibernate从数据库加载含有子类的实体类对象时,检查其真实类型是非常必要的。因为可能取出来的是一个代理对象。所以需要在取完数据之后判断该对象是否是其本身,是或不是就返回本身。

提供的一个工具类,如下:

  1. public class HbUtils {
  2.  
  3. public static <T> T deproxy (T obj) {
  4. if (obj == null)
  5. return obj;
  6. if (obj instanceof HibernateProxy) {
  7. // Unwrap Proxy;
  8. // -- loading, if necessary.
  9. HibernateProxy proxy = (HibernateProxy) obj;
  10. LazyInitializer li = proxy.getHibernateLazyInitializer();
  11. return (T) li.getImplementation();
  12. }
  13. return obj;
  14. }
  15.  
  16. public static boolean isProxy (Object obj) {
  17. if (obj instanceof HibernateProxy)
  18. return true;
  19. return false;
  20. }
  21.  
  22. // ----------------------------------------------------------------------------------
  23.  
  24. public static boolean isEqual (Object o1, Object o2) {
  25. if (o1 == o2)
  26. return true;
  27. if (o1 == null || o2 == null)
  28. return false;
  29. Object d1 = deproxy(o1);
  30. Object d2 = deproxy(o2);
  31. if (d1 == d2 || d1.equals(d2))
  32. return true;
  33. return false;
  34. }
  35.  
  36. public static boolean notEqual (Object o1, Object o2) {
  37. return ! isEqual( o1, o2);
  38. }
  39.  
  40. // ----------------------------------------------------------------------------------
  41.  
  42. public static boolean isSame (Object o1, Object o2) {
  43. if (o1 == o2)
  44. return true;
  45. if (o1 == null || o2 == null)
  46. return false;
  47. Object d1 = deproxy(o1);
  48. Object d2 = deproxy(o2);
  49. if (d1 == d2)
  50. return true;
  51. return false;
  52. }
  53.  
  54. public static boolean notSame (Object o1, Object o2) {
  55. return ! isSame( o1, o2);
  56. }
  57.  
  58. // ----------------------------------------------------------------------------------
  59.  
  60. public static Class getClassWithoutInitializingProxy (Object obj) {
  61. if (obj instanceof HibernateProxy) {
  62. HibernateProxy proxy = (HibernateProxy) obj;
  63. LazyInitializer li = proxy.getHibernateLazyInitializer();
  64. return li.getPersistentClass();
  65. }
  66. // Not a Proxy.
  67. return obj.getClass();
  68. }
  69.  
  70. }

hibernate JPA 使用懒加载时代理对象的更多相关文章

  1. JPA数据懒加载LAZY配合事务@Transactional使用(三)

    上篇博文<JPA数据懒加载LAZY和实时加载EAGER(二)>讲到,如果使用懒加载来调用关联数据,必须要保证主查询session(数据库连接会话)的生命周期没有结束,否则,你是无法抽取到数 ...

  2. JPA的懒加载

    JPA数据懒加载LAZY和实时加载EAGER(二)   懒加载LAZY和实时加载EAGER的概念,在各种开发语言中都有广泛应用.其目的是实现关联数据的选择性加载,懒加载是在属性被引用时,才生成查询语句 ...

  3. 解决hibernate中的懒加载(延迟加载)问题

    解决hibernate中的懒加载(延迟加载)问题   我们在开发的时候经常会遇到延迟加载问题,在实体映射时,多对一和多对多中,多的一样的属性默认是lazy="true"(即,默认是 ...

  4. JPA数据懒加载LAZY和实时加载EAGER(二)

    懒加载LAZY和实时加载EAGER的概念,在各种开发语言中都有广泛应用.其目的是实现关联数据的选择性加载,懒加载是在属性被引用时,才生成查询语句,抽取相关联数据.而实时加载则是执行完主查询后,不管是否 ...

  5. mybatis和hibernate中的懒加载

    概念:所谓懒加载就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限 ,为了减 ...

  6. JPA数据懒加载LAZY和实时加载EAGER(转)

    原文:https://www.cnblogs.com/MrSi/p/8081811.html 懒加载LAZY和实时加载EAGER的概念,在各种开发语言中都有广泛应用.其目的是实现关联数据的选择性加载, ...

  7. hibernate中的懒加载和急加载

    懒加载(FatchType.LAZY)是Hibernate为提高程序执行效率而提供的一种机制,简单说就是只有正真使用其属性的时候,数据库才会进行查询. 具体的执行过程就是:Hibernate从数据库获 ...

  8. Rest风格中关于JPA使用懒加载的坑

    公司最近使用的ORM框架是JPA实现产品使用的是hibernate,曾经看过一篇博客上面说的是如果团队里面没有一个精通hibernate的人,那么最好不要使用它,我现在是深刻的体会到了.但是使用什么框 ...

  9. Hibernate缓存和懒加载的坑你知道多少?这5个简单问题回答不上来就不敢说会用hibernate

    问题1:session.flush()调用之后,懒加载还生效吗? 如果不生效,那是抛异常还是没有任何反应,或者直接返回null? 答案:生效.可以理解为在同一个session当中,懒加载只会执行一次. ...

随机推荐

  1. Codeforces Round #460 (Div. 2) ABCDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8397685.html 2018-02-01 $A$ 题意概括 你要买$m$斤水果,现在有$n$个超市让你选择. ...

  2. Java中用Scanner扫描控制台输入时的一个小问题

    package com.hxl; import java.util.Scanner; public class Test { public static void main(String[] args ...

  3. 阿里巴巴Java开发规范手册

      Java开发手册 版本号 制定团队 更新日期 备  注 1.0.0 阿里巴巴集团技术部 2016.12.7 首次向Java业界公开 一.编程规约 (一) 命名规约 1.   [强制]所有编程相关命 ...

  4. docker保存、载入、导出、导入

    保存和载入 拿到CONTAINER ID docker ps -a 通过容器id生成镜像dockerlinuxdemoweb:update docker commit b33633d12871 doc ...

  5. 008 在大数据中,关于native包的编译步骤

    一.问题的由来: 二.解决问题的方法(所有的操作在root下完成): 1.前期需要的环境,下面的已经在伪分布式中配置好,不再重复 配置好jdk 配置好hadoop 2.上传还需要包 apache-ma ...

  6. 1、Qt Project之基本文件打开与保存

    基本文件打开与保存: 首先是涉及到的头文件,我们需要在mainwindow.h包含头文件: #include <QFileDialog> #include <QFile> #i ...

  7. new Vue 发生了什么

    new Vue 发生了什么 new vue 我们从入口分析,我们new 一个实例化对象,是由Funcction实现的,来看一下源码,在src/core/instance/index.js 中. imp ...

  8. 开源医学图像处理平台NiftyNet介绍

    18年下半年10月份左右,老师分配有关NiftyNet平台的相关学习的任务,时隔5个月,决定整理一下以前的笔记,写成相应的博客! 目录 1.NiftyNet平台简介 2.NiftyNet平台架构设计 ...

  9. STRING DELIMITED BY SIZE

    The following COBOL program depicts the use of  STRING DELIMITED BY SIZE                 IDENTIFICAT ...

  10. 现在没有可用的软件包 *** ,但是它被其它的软件包引用了 和 E: 无法定位软件包 ***问题解决(思路清晰干货)

    问题现象 root@zhouls-virtual-machine:~/snort_src# apt-get install bison flex 正在读取软件包列表... 完成 正在分析软件包的依赖关 ...