关于hibernate的查询问题
public Admindto getAdminByID(int id) {
// TODO Auto-generated method stub
try{
Session s=(Session) hibernateUtil.currentSession();//取得session
hibernateUtil.beginTransaction();//开始事务
Admindto admin=(Admindto)s.load(Admindto.class, id);
s.flush();
System.out.print(admin.getPassword());
hibernateUtil.commitTransaction();//关闭事务
hibernateUtil.closeSession();
return admin;
}
catch(
HibernateException e){
hibernateUtil.commitTransaction();//关闭事务
hibernateUtil.closeSession();
log.fatal(e);
}
return null;
}
问题就是为什么我要打印才能正确运行呢?如果不打印却不能获得正确的admin类!
------解决方案--------------------因为hibernate load出来的时候只是一个proxy,并不是真正的admin,这个proxy只有和admin相同的id属性,而其他属性都是null。
所以如果你在事务外面读取其他属性(除id)都会产生
LazyInitializationException(大概吧,记不清了 )。但是,当你在事务里
读取了其他属性,(这里是password)那么,hibernate会足够聪明的把这个proxy转化成真正的admin,所以这时候你得到的是真正的
admin。如果你不想这么麻烦,想要在读取admin时就得到一个真正的实体,那么可以设置lazy = "false", (当然还有其他的办法);
------解决方案--------------------
在具体的属性上设置
XML code
<class name="Document">
<id name="id">
<generator class="native"/>
</id>
<property name="name" not-null="true" length="50"/>
<property name="summary" not-null="true" length="200" lazy="true"/>
<property name="text" not-null="true" length="2000" lazy="true"/>
</class>
------解决方案--------------------
hibernate-mapping
class
property
subclass
component
等等元素都有跟lazy相关的设置,可以根据自己的选择适当的地方来设置。