Hibernate.initialize
持久化时,有时需要动态的改变对象的加载,比如在编辑页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制。而配置文件中Lazy属性是全局控制的,如何处理呢?
当<class>元素或者<set>元素的lazy属性为true时,load() or get() or find()加载这些对象时,Hibernate不会马上产生任何select语句,只是产生一个Obj代理类实例,只有在session没有关闭的情况下运行Obj.getXxx()时才会执行select语句从数据库加载对象,如果没有运行任何Obj.getXxx()方法,而session已经关闭,Obj已成游离状态,此时再运行Obj.getXxx()方法,Hibernate就会抛出"Could not initialize proxy - the owning Session was closeed"的异常,是说Obj代理类实例无法被初始化。然而想在Session关闭之前不调用Obj.getXxx()方法而关闭Session之后又要用,此时只要在Session关闭之前调用Hibernate.initialize(Obj)或者Hibernate.initialize(Obj.getXxx())即可,net.sf.hibernate.Hibernate类的initialize()静态方法用于在Session范围内显示初始化代理类实例。
在配置文件里面可以用lazy=true,在程序里面可以用强制加载的方法Hibernate.initialize(Object proxy) 方法强制加载这样就相当于动态改变为lazy=false。
但在使用时需要注意的一点是:其中的proxy是持久对象的关联对象属性,比如A实体,你要把A的关联实体B也检出,则要写Hibernate.initialize(a.b)。
HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。
HibernateTemplate的灵活访问方式是通过如下两个方法完成:
(1)Object execute(HibernateCallback action)
(2)List execute(HibernateCallback action)
这两个方法都需要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用。
程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。
HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),
该方法只有一个参数Session。通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,
方法doInHibernate的方法体就是Spring执行的持久化操作。
做分页:
public List findByPage(final String hql,
final int offset, final int pageSize)
{
//通过一个HibernateCallback对象来执行查询
List list = getHibernateTemplate()
.executeFind(new HibernateCallback()
{
//实现HibernateCallback接口必须实现的方法
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
//执行Hibernate分页查询
List result = session.createQuery(hql)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
public List findByPage(final String hql , final Object value ,
final int offset, final int pageSize)
{
//通过一个HibernateCallback对象来执行查询
List list = getHibernateTemplate()
.executeFind(new HibernateCallback()
{
//实现HibernateCallback接口必须实现的方法
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
//执行Hibernate分页查询
List result = session.createQuery(hql)
//为hql语句传入参数
.setParameter(0, value)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
public List findByPage(final String hql, final Object[] values,
final int offset, final int pageSize)
{
//通过一个HibernateCallback对象来执行查询
List list = getHibernateTemplate()
.executeFind(new HibernateCallback()
{
//实现HibernateCallback接口必须实现的方法
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
//执行Hibernate分页查询
Query query = session.createQuery(hql);
//为hql语句传入参数
for (int i = 0 ; i < values.length ; i++)
{
query.setParameter( i, values[i]);
}
List result = query.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
}
分享到:
相关推荐
9. **延迟加载**:Hibernate的懒加载机制可以在需要时才加载关联的对象,避免了不必要的数据库访问,提高了效率。 10. **事务支持**:Hibernate完全支持JTA(Java Transaction API),可以方便地集成到各种事务管理...
Hibernate允许开发者定义对象的生命周期回调方法,如preInsert()、postInsert()、preUpdate()等,以便在对象状态改变时执行特定的业务逻辑。 **九、懒加载与立即加载** 懒加载(Lazy Loading)是一种优化策略,只在...
1. **修改Fetch策略**:将Fetch策略设置为`fetch="join"`,即在查询主对象的同时通过JOIN查询的方式加载关联对象,这样就不会抛出延迟加载异常。 2. **禁用延迟加载**:将`lazy="false"`,这样就会在查询主对象时...
### Hibernate配置文件加载后修改配置信息 在Java开发过程中,特别是在使用ORM框架如Hibernate时,开发者经常需要对配置文件中的数据库连接信息进行动态修改或加密处理。本文将详细介绍如何利用反射机制来修改已经...
如果需要从数据库加载特定对象,Hibernate会首先检查Session缓存,若未找到再查询数据库。此外,即使在同一个Session内,多次调用`get()`或`load()`方法获取同一个持久对象,也会返回相同的实例,这是由于对象的缓存...
然而,由于Flex与Java之间的通信通常通过AMF(Action Message Format)进行,而AMF不理解Hibernate的代理对象,这导致了延迟加载的问题。 本文将深入探讨几种解决Flex与Hibernate延迟加载问题的方法,并着重讲解...
在Java的持久化框架Hibernate中,缓存机制和Session对象的管理是其高效运作的关键要素。本文将深入探讨这两个主题,以帮助开发者更好地理解和利用Hibernate。 首先,让我们聚焦于Hibernate的缓存机制。缓存的存在是...
Hibernate支持事件监听,可以通过实现特定接口如PreLoadEventListener,对对象加载、保存等生命周期事件进行监听和处理。 八、级联操作 级联操作允许在一个对象的操作中同时影响到与其关联的对象,如CascadeType....
在数据库操作中,有时我们需要记录对象最后修改的时间。Hibernate-Extensions提供了一种自动化方式来处理这些时间戳,比如在对象更新时自动更新某个字段,无需手动设置。 五、其他功能 除了上述特性,Hibernate-...
- 从**游离状态**到**持久状态**:使用`merge`方法,将游离对象的状态合并到一个新的持久化对象上,或者在新的`Session`中重新加载对象。 理解这些状态转换关系有助于我们在编程中合理地管理对象,确保数据的一致性...
`javassist`是Hibernate3依赖的一个库,用于动态修改Java类。在运行时,Hibernate使用javassist来生成代理类,实现透明的持久化。例如,当执行HQL查询时,Hibernate会利用javassist动态生成对应的SQL并执行。此外,...
3. **更新(Update)**:调用`merge()`或直接修改对象属性后`flush()`。 4. **删除(Delete)**:`delete()`或`remove()`。 六、 Session与Transaction 在进行数据库操作前,需要创建Session并开启Transaction。...
当一个对象的部分属性被修改时,传统的做法是先从数据库中加载该对象的完整信息,再将新值设置到对应的属性上,最后更新整个对象到数据库。这种方式在处理大量字段时不仅耗时,而且容易出错,特别是当对象有多个字段...
例如,当实体对象的集合属性未被访问时,Hibernate不会立即加载这些数据,而是等到需要时才加载,减少不必要的数据库交互。这种机制降低了初始化对象的成本,但需要注意N+1查询问题,需要合理设计实体关联的加载策略...
在Hibernate框架中,对象的状态管理和保存机制是其核心特性之一,它们直接影响到数据的持久化操作。以下是关于Hibernate中对象的三种状态以及保存方法的详细分析: 1. **对象的三种状态** - **瞬态(Transient)**...
2. 修改对象关系文件:将lazy改写lazy=false,即关闭懒加载。这也可以解决问题,但是也存在同样的缺点。 3. 使用过滤器:在web项目中使用过滤器,可以在请求结束时关闭session,从而解决懒加载问题。这种方法可以...
2. **懒加载与立即加载**: Hibernate提供了懒加载机制,只在需要时加载关联对象,提高性能。但需注意N+1查询问题。 3. **缓存机制**: Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的...
8. **延迟加载(Lazy Loading)**:Hibernate支持懒加载机制,只有当真正需要访问关联对象时,才会发起数据库查询。 9. **集合映射**:Hibernate支持多种集合类型的映射,如List、Set、Map等,以及一对一、一对多、多...