openSession :- When you call SessionFactory.openSession, it always create new Session object afresh and give it to you.
你需要明確沖洗和關閉這些會話對象。 由於會話對象不是線程安全的,因此您需要在多線程環境中爲每個請求創建一個會話對象,並在Web應用程序中爲每個請求創建一個會話。
getCurrentSession :- When you call SessionFactory. getCurrentSession, it will provide you session object which is in hibernate context and managed by hibernate internally. It is bound to transaction scope.
When you call SessionFactory. getCurrentSession , it creates a new Session if not exists , else use same session which is in current hibernate context. It automatically flush and close session when transaction ends, so you do not need to do externally.
If you are using hibernate in single threaded environment , you can use getCurrentSession, as it is faster in performance as compare to creating new session each time.
You need to add following property to hibernate.cfg.xml to use getCurrentSession method.
<session-factory>
<!-- Put other elements here -->
<property name="hibernate.current_session_context_class">
thread
</property>
</session-factory>
非常感謝@gkamal。我查看[Open View in View](http://community.jboss.org/wiki/OpenSessionInView)文件中的代碼。 (您的鏈接指向該文檔。)作者建議使用過濾器。在他的過濾代碼中,他不會調用'openSession()'或'close()'。他只調用'getCurrentSession()'。我猜他把'current_session_context'設置爲'thread'。現在我想我理解'getCurrentSession()'。但是,我不知道什麼時候應該使用'openSession()'。 – wannik
如果您不想將會話綁定到任何上下文,您將使用OpenSession。在某些情況下,你需要一個不同的會話 - 除了綁定到上下文之外(Hibernate攔截器有一個侷限性,你不能使用原始會話) - 在這種情況下,你將使用OpenSession而不是currentSession。 OpenSession創建一個新的會話,您必須明確關閉。例如,在DAO方法中,您將調用OpenSession - 使用會話並關閉它。 – gkamal
am使用getCurrentSession();因爲我在監聽器中初始化它,而不是過濾器從您的視圖中可以看到;我正在使用mvc2 jsp servlet – shareef