Hibernate实例化集合和代理在Session范围之外访问未初始化的集合或代理,Hibernate将会抛出LazyInitializationException异常。
本文向大家介绍Hibernate中实例化集合和代理,可能好多人还不了解Hibernate中实例化集合和代理,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。
Hibernate中实例化集合和代理在Session范围之外访问未初始化的集合或代理,Hibernate将会抛出LazyInitializationException异常。 也就是说,在分离状态下,访问一个实体所拥有的集合,或者访问其指向代理的属性时,会引发此异常。
有时候我们需要保证某个代理或者集合在Session关闭前就已经被初始化了。 当然,我们可以通过强行调用cat.getSex()或者cat.getKittens().size()之类的方法来确保这一点。 但是这样的程序会造成读者的疑惑,也不符合通常的代码规范。
静态方法Hibernate.initialized() 为你的应用程序提供了一个便捷的途径来延迟加载集合或代理。 只要它的Session处于open状态,Hibernate.initialize(cat) 将会为cat强制对代理实例化。 同样,Hibernate.initialize( cat.getKittens() ) 对kittens的集合具有同样的功能。
还有另外一种选择,就是保持Session一直处于open状态,直到所有需要的集合或代理都被载入。 在某些应用架构中,特别是对于那些使用Hibernate进行数据访问的代码,以及那些在不同应用层和不同物理进程中使用Hibernate的代码。 在集合实例化时,如何保证Session处于open状态经常会是一个问题。有两种方法可以解决此问题:
在一个基于Web的应用中,可以利用servlet过滤器(filter),在用户请求(request)结束、页面生成 结束时关闭Session(这里使用了在展示层保持打开Session模式(Open Session in View)), 当然,这将依赖于应用框架中异常需要被正确的处理。
在返回界面给用户之前,乃至在生成界面过程中发生异常的情况下, 正确关闭Session和结束事务将是非常重要的, 请参见Hibernate wiki上的"Open Session in View"模式,你可以找到示例。
在一个拥有单独业务层的应用中,业务层必须在返回之前,为web层“准备”好其所需的数据集合。这就意味着 业务层应该载入所有表现层/web层所需的数据,并将这些已实例化完毕的数据返回。
通常,应用程序应该 为web层所需的每个集合调用Hibernate.initialize()(这个调用必须发生咱session关闭之前); 或者使用带有FETCH从句,或FetchMode.JOIN的Hibernate查询, 事先取得所有的数据集合。
如果你在应用中使用了Command模式,代替Session Facade , 那么这项任务将会变得简单的多。
你也可以通过merge()或lock()方法,在访问未实例化的集合(或代理)之前, 为先前载入的对象绑定一个新的Session。
显然,Hibernate将不会,也不应该自动完成这些任务,因为这将引入一个特殊的事务语义。
有时候,你并不需要完全实例化整个大的集合,仅需要了解它的部分信息(例如其大小)、或者集合的部分内容。
你可以使用集合过滤器得到其集合的大小,而不必实例化整个集合:
- ( (Integer) s.createFilter( collection, "select count(*)" ).list().get(0) ).intValue()
这里的createFilter()方法也可以被用来有效的抓取集合的部分内容,而无需实例化整个集合:
- s.createFilter( lazyCollection, "").setFirstResult(0).setMaxResults(10).list();
分享到:
相关推荐
在Java的持久化框架Hibernate中,延迟加载(Lazy Load)是一项重要的优化策略,其核心目标是提高系统性能,减少内存占用,避免不必要的数据库交互。延迟加载允许我们在需要使用数据时才从数据库中加载,而不是在加载...
持久化集合类(Persistent Collections) 6.2. 映射集合(Mapping a Collection) 6.3. 值集合和多对多关联(Collections of Values and Many-To-Many Associations) 6.4. 一对多关联(One-To-Many ...
19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using subselect fetching) 19.1.7. 使用延迟属性抓取(Using lazy...
实例化集合和代理(Initializing collections and proxies) 20.1.5. 使用批量抓取(Using batch fetching) 20.1.6. 使用子查询抓取(Using subselect fetching) 20.1.7. 使用延迟属性抓取(Using lazy ...
19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using subselect fetching) 19.1.7. 使用延迟属性抓取(Using lazy...
19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using subselect fetching) 19.1.7. 使用延迟属性抓取(Using lazy...
总的来说,代理模式在软件开发中是一个强大的工具,它提供了扩展功能、控制访问和优化性能的可能性,尤其是在 ORM 框架如 Hibernate 中,其懒加载机制就是代理模式的一个经典应用。通过合理地使用代理模式,我们可以...
为了通过反射机制(Reflection)来实例化这个类的对象,我们需要提供一个无参的构造器(no-argument constructor)。 对一特定的event, id 属性持有唯一的标识符(identifier)的值。如果我们希望使用Hibernate提供...
Hibernate是一款开源的对象关系映射(ORM)框架,它允许Java开发者在关系数据库上进行面向对象的编程。...在SSH框架中,熟练掌握Hibernate能有效提升项目开发效率,确保数据操作的准确性和高效性。
19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using subselect fetching) 19.1.7. 使用延迟属性抓取(Using lazy...
- `load()`方法在一个事务中返回的对象是同一个代理对象,即`c1`和`c2`指向的是同一个对象。 - 因此,打印结果是C) `true`。 #### 7. 更新语句的数量 - **程序分析**: - 由于`setName()`方法的调用发生在同一...
在Hibernate中,这用于创建实体的代理实例,从而在需要时执行数据库查询,而不是在初始化时立即加载所有数据。 KeyFactory是CGLIB中的另一个工具,它可以用于生成处理一组关键字集合的工厂类。这对于构建复杂的数据...
这份文档集将带你逐步探索Hibernate的世界,从基本的配置到复杂的查询,从简单的CRUD操作到事务和缓存管理,全方位提升你在Java开发中的数据库操作技能。无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。...
2. Hibernate配置:讲解如何配置Hibernate的XML文件,包括hibernate.cfg.xml和实体类的hbm.xml映射文件,以及如何在程序中加载和初始化Hibernate会话工厂。 3. 实体类和映射文件:详述如何设计和创建符合Java Bean...
《Hibernate in Action》中文版是一本深度探讨Java持久化框架Hibernate的专业书籍,它全面而深入地介绍了如何在实际开发中高效、灵活地使用Hibernate。这本书是针对Java开发者,特别是那些致力于构建数据库驱动应用...
Hibernate是一个强大的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中处理数据库操作,而无需直接编写SQL语句。这个压缩包文件“hibernate类库的全部jar包文件(包括依赖库)”提供了开发Hibernate应用...
11.3.3 在Java SE中扩展持久化上下文 11.4 使用EJB 3.0的对话 11.4.1 使用EJB的上下文传播 11.4.2 利用EJB扩展持久化上下文 11.5 小结 第12章 有效修改对象 12.1 传播性持久化 12.1.1...
在实际面试中,面试官可能还会深入探讨更多高级特性和最佳实践,如性能优化、延迟加载、级联操作、代理对象、查询优化、事务隔离级别等。对于求职者来说,全面理解和掌握这些知识是至关重要的。
19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using subselect fetching) 19.1.7. 使用延迟属性抓取(Using lazy...