引用来自:
http://stackoverflow.com/questions/16383742/hibernate-javassistlazyinitializer-problems-with-validation问题描述:
当两个对象相互关联并使用懒加载时,从数据库中取出来使用时报错,查看对象所有字段的值为null;但通过get\setXXX()有能得到该对象的字段值。
产生原因:
hibernate懒加载使用代理所导致。
解决方法:
在使用hibernate从数据库加载含有子类的实体类对象时,检查其真实类型是非常必要的。因为可能取出来的是一个代理对象。所以需要在取完数据之后判断该对象是否是其本身,是或不是就返回本身。
感谢提供的一个工具类,如下:
public class HbUtils { public static <T> T deproxy (T obj) { if (obj == null) return obj; if (obj instanceof HibernateProxy) { // Unwrap Proxy; // -- loading, if necessary. HibernateProxy proxy = (HibernateProxy) obj; LazyInitializer li = proxy.getHibernateLazyInitializer(); return (T) li.getImplementation(); } return obj; } public static boolean isProxy (Object obj) { if (obj instanceof HibernateProxy) return true; return false; } // ---------------------------------------------------------------------------------- public static boolean isEqual (Object o1, Object o2) { if (o1 == o2) return true; if (o1 == null || o2 == null) return false; Object d1 = deproxy(o1); Object d2 = deproxy(o2); if (d1 == d2 || d1.equals(d2)) return true; return false; } public static boolean notEqual (Object o1, Object o2) { return ! isEqual( o1, o2); } // ---------------------------------------------------------------------------------- public static boolean isSame (Object o1, Object o2) { if (o1 == o2) return true; if (o1 == null || o2 == null) return false; Object d1 = deproxy(o1); Object d2 = deproxy(o2); if (d1 == d2) return true; return false; } public static boolean notSame (Object o1, Object o2) { return ! isSame( o1, o2); } // ---------------------------------------------------------------------------------- public static Class getClassWithoutInitializingProxy (Object obj) { if (obj instanceof HibernateProxy) { HibernateProxy proxy = (HibernateProxy) obj; LazyInitializer li = proxy.getHibernateLazyInitializer(); return li.getPersistentClass(); } // Not a Proxy. return obj.getClass(); } }
相关推荐
Hibernate JPA提供了自动持久化机制,例如,当对象被添加到Session时,其状态会被自动持久化。 - **会话(Session)**:在Hibernate JPA中,Session负责管理对象的生命周期,如保存、更新、删除和查询操作。它是与...
4. **javassist-3.4.ga.jar**:Javaassist是一个开源库,它允许在运行时动态修改类和方法,Hibernate使用它来实现动态代理和元数据驱动的代码生成。 5. **log4j-1.2.13.jar**:Log4j是一个流行的日志记录框架,用于...
在Java世界中,Hibernate和Java Persistence API (JPA) 是两个强大的对象关系映射(ORM)框架,它们简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。本篇文章将深入探讨Hibernate JPA入门案例所需的...
3. **懒加载(Lazy Loading)**:避免在不需要时加载关联数据,减少内存消耗。 总结来说,Hibernate JPA为Java开发人员提供了强大且灵活的ORM工具,通过简化数据库操作,使得开发者能更专注于业务逻辑。正确理解和...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
然后,当访问`saveUser.htm`这个URL时,Spring MVC会处理请求,通过Spring配置的数据源连接到数据库,使用Hibernate或JPA执行保存用户数据的操作。如果数据库中出现了新记录,那就意味着整合成功。 总的来说,这个...
【描述】在IT领域,Hibernate是一个广泛使用的对象关系映射(ORM)框架,而Java Persistence API (JPA)是Java平台上的一个标准,用于管理和持久化Java应用程序中的对象。这个实例是关于如何在实际项目中结合使用...
在IT行业中,构建一个完整的Web应用常常涉及到多个技术的整合,本示例中提到了"HibernateJPA+Struts2.0+MariaDB"的组合,这是一个经典的Java Web开发架构,用于实现用户登录功能。接下来,我们将深入探讨这些技术...
然而,需要注意的是,虽然ORM工具带来了便利,但也可能因为过度依赖导致性能问题,如N+1查询、懒加载地狱等,因此在实际使用中需权衡利弊,合理设计数据访问策略。 总的来说,Hibernate JPA.jar文件是Java开发者...
- **延迟加载**: JPA的懒加载机制使得关联的对象只有在真正需要时才从数据库加载,提高性能。 **3. Hibernate JPA 2.1 API的使用** - **配置**: 开发者需要在pom.xml或build.gradle文件中添加`hibernate-jpa-2.1-...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
Hibernate JPA作为一种成熟且广泛使用的ORM解决方案,不仅简化了Java应用程序中对象与关系型数据库之间的交互,还为开发者提供了强大的工具和灵活的配置选项。无论是初学者还是经验丰富的开发者,都能从中受益。了解...
Hibernate JPA因其灵活性和广泛社区支持而受到欢迎,尤其是在处理复杂业务逻辑和非标准SQL需求时。 **3. OpenJPA** OpenJPA是由Apache软件基金会开发的开源JPA实现。它是一个轻量级、高性能的解决方案,设计目标是...
hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码
3. **Hibernate的Hibernate.initialize()方法**:在需要使用懒加载属性的地方,手动调用此方法初始化代理对象。但这需要在业务代码中显式处理,不够优雅。 4. **使用Hibernate的Criteria API或HQL查询**:在查询时...
在Java开发中,Hibernate是一个广泛使用的对象关系映射(ORM)框架,而Java Persistence API (JPA) 是Java平台上的标准ORM规范。两者结合,可以让开发者轻松地将数据库表与Java类进行绑定,从而实现数据的CRUD操作。...
4. **持久化上下文(Persistence Context)**:内存中的缓存,保存了实体的状态,提供了事务管理和懒加载等功能。 **Spring Data JPA**是Spring项目下的子项目,它为JPA提供了更高级别的抽象,使得数据库操作更加...
4. **懒加载和级联操作**:JPA支持实体之间的关联关系,并能处理关联对象的懒加载和级联操作。 5. **实体状态管理**:JPA管理实体对象的状态,包括 managed、transient、persistent 和 detached 状态,帮助开发者更...
默认情况下,一对多和多对多关系使用的是懒加载,这意味着在获取父实体时不会立即加载子实体,而是在需要时才查询数据库。可以使用`fetch = FetchType.EAGER`来改变这个行为,使子实体在获取父实体时一起加载。 6. ...