+ -
当前位置:首页 → 问答吧 → 请教一个关于Hibernate的问题

请教一个关于Hibernate的问题

时间:2011-09-13

来源:互联网

在查询数据的时候,用get方法,可以查到,用load方法就报异常could not initialize proxy - no Session

我的相应的User.hbm.xml里有设置lazy为false.
这是为什么呢?

作者: ansn001   发布时间: 2011-09-13

lazy属性的意思是延迟加载,load方法就是使用延迟加载,而现在lazy=false就是不开启,所以会保错,改成lazy=true就好了

作者: EverWHL   发布时间: 2011-09-13

可是改为lazy=true的时候load还是查不出数据啊?
用lazy=false时,使用get方法可以查出来,按理说应该查询数据是没问题的吧?

我主键id=2
方法 findById(2l);//2 long

作者: ansn001   发布时间: 2011-09-13


LZ如果设置lazy=false表示不延迟加载,那么查找顺序就和get一样(session缓存中、二级缓存、数据库);

LZ报错是无法使用代理,莫非session失效

作者: lvhongfen   发布时间: 2011-09-13


hibernate在3以后的版本中就用get()取代了find()方法了!

作者: lvhongfen   发布时间: 2011-09-13

我用的是hibernate3以后的。
用get()取代find()??????是什么意思?
是用get()取代load()???吧???

作者: ansn001   发布时间: 2011-09-13

session关闭后在去load了?

作者: tanwan   发布时间: 2011-09-13

对了,再补充下。。。。不管lzay设置true or false.用get都能得出正确的结果。。。一用load()就异常。。。这个头疼。想看一下load()不报异常。。。正确查询出来的效果

作者: ansn001   发布时间: 2011-09-13

/**
* 查询用户信息
*/
public User findById(Long id) {
User user=null;
try {
user=(User)getSession().load(User.class,id);
} catch (HibernateException e) {
e.printStackTrace();
}finally{
getSession().close();
getSessionFactory().close();
}
return user;

}

作者: ansn001   发布时间: 2011-09-13

get和load是hibernate查询的两种不同的机制。我这里说个大概的,如果你想了解得更详细的话,自己找下相关的资料看看.
查询数据时,它们都是先在缓存中找,缓存中没有的话,再到数据库中查找,但还是有区别的。

1.如果找不到符合条件的纪录,get方法将返回null.而load将会报出ObjectNotFoundEcception.
2.load方法可以返回实体的代理类实例,而get永远只返回实体类.
3.load方法可以充分利用二级缓存和内部缓存的现有数据,而get方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找.

你的帖子中的异常估计就是由于配置和代码的原因引起的,就是说用load方法的时候,没有能返回代理..

呵呵,希望可以帮上你..

作者: bijanen19861113   发布时间: 2011-09-13

楼主在使用load方法的时候把return user;放在try块里试试。

作者: a745248674   发布时间: 2011-09-13

你session 肯定是关闭了啊

作者: ajun_studio   发布时间: 2011-09-13

放在try里面也没用.他finally里面关闭了session
引用 10 楼 a745248674 的回复:

楼主在使用load方法的时候把return user;放在try块里试试。

作者: hxiaocai   发布时间: 2011-09-13

那怎么办?难道就不关闭session了吗?

作者: ansn001   发布时间: 2011-09-13

lz难道没有连接池?

作者: quanlei1507053   发布时间: 2011-09-13

我不建议lz把User.hbm.xml里有配置lazy,我一般在hql语句上搞

作者: quanlei1507053   发布时间: 2011-09-13

上面 说的很对。

作者: SmileToCandy   发布时间: 2011-09-13

<hibernate-configuration>

  <session-factory>
  <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
  <property name="connection.url">jdbc:oracle:thin:@localhost:1521:ansn001</property>
  <property name="connection.username">house</property>
  <property name="connection.password">01026891</property>
  <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
 
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="cache.query_cache_factory">true</property>
<mapping resource="cn/jbit/houserent/bean/User.hbm.xml" />
  </session-factory>

</hibernate-configuration>

用的直接配置hibernate的
难道这个也是默认成连接池????这个我刚学hibernate没多久,见谅哦。请帮着多解释下

作者: ansn001   发布时间: 2011-09-13

刚试了下。可以。。。不过这个也是默认连接池吗???可是他没有连接池的配置呀??
比如maxactive maxwait 等等,
那这些属性他是怎么决定的呢?

作者: ansn001   发布时间: 2011-09-13

恩恩,关键我还没学到hql呢。得过段时间。现在还在学基础呢?所以想把原理搞清楚些

作者: ansn001   发布时间: 2011-09-13