1. 程式人生 > >hibernate架構之session中get與load方法的區別

hibernate架構之session中get與load方法的區別

r.java one 升級版 數據庫 apache appenders 進行 方法 main

hibernate是一個用於連接數據庫的升級版JDBC,與一般JDBC不同的是,hibernate架構是通過hql進行查找,通過session建立連接。其工作原理是:將實例分為瞬時狀態、持久狀態、遊離狀態,通過hql對持久狀態的實例進行CRUD。在學習的過程中我們遇到了這樣的一個現象:用Session對象調用get()方法和load()方法獲取對象時,類似的代碼會分為兩種結果,get方法運行成功,load方法會報錯,代碼示例如下:

get()方法源代碼:

Session session= HibernateSessionFactory.getSession();

SysUserEntity user=(SysUserEntity)session.get(SysUserEntity.class,id);

HibernateSessionFactory.closeSession();

運行結果:代碼運行成功

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate: select sysuserent0_.userId as userId1_0_0_, sysuserent0_.user as

user2_0_0_, sysuserent0_.loginPassWord as loginPas3_0_0_, sysuserent0_.loginUser as

loginUse4_0_0_ from sys_user sysuserent0_ where sysuserent0_.userId=?
曹操

load()方法源代碼:

Session session= HibernateSessionFactory.getSession();

SysUserEntity user=(SysUserEntity)session.load(SysUserEntity.class,id);

HibernateSessionFactory.closeSession();

運行結果:代碼報錯原因是在關閉了session

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at com.lovo.h.entity.SysUserEntity_$$_jvstb09_0.getLoginUser(SysUserEntity_$$_jvstb09_0.java)
at com.lovo.h.test.T.main(T.java:36)

session中的load()方法默認使用了懶加載,也就是說調用load()會把數據加載到緩存中,而只有當實際調用時才會在數據庫中執行查找語句,這樣就引起了矛盾:load()得到的實例是持久狀態的實例,實際調用時已經關閉了session,那麽此時的實例就是遊離狀態的實例,只有持久狀態的實例才能在數據庫中得到數據,因此會拋出異常。

hibernate架構之session中get與load方法的區別