Java應用程序與Hibernate之間的主要運行時接口。它是抽象了持久化服務概念的核心抽象API類。
Session的生命周期綁定在一個物理的事務(tansaction)上面。(長的事務可能跨越多個數據庫事物。)
Session的主要功能是提供對映射的實體類實例的創建,讀取和刪除操作。實例可能以下面三種狀態存在:
自由狀態(transient): 不曾進行持久化,未與任何Session相關聯
持久化狀態(persistent): 僅與一個Session相關聯
游離狀態(detached): 已經進行過持久化,但當前未與任何Session相關聯
游離狀態的實例可以通過調用save()、persist()或者saveOrUpdate()方法進行持久化。持久化實例可以通過調用 delete()變成游離狀態。通過get()或load()方法得到的實例都是持久化狀態的。游離狀態的實例可以通過調用 update()、0saveOrUpdate()、lock()或者replicate()進行持久化。游離或者自由狀態下的實例可以通過調用merge()方法成為一個新的持久化實例。
save()和persist()將會引發SQL的INSERT,delete()會引發SQLDELETE,而update()或merge()會引發SQLUPDATE。對持久化(persistent)實例的修改在刷新提交的時候會被檢測到,它也會引起SQLUPDATE。saveOrUpdate()或者replicate()會引發SQLINSERT或者UPDATE。
其具體實現并不一定是線程安全的。每個線程/事務應該從一個SessionFactory獲取自己的session實例。
如果其持久化對象類是可序列化的,則Session實例也是可序列化的。
一個典型的事務應該使用下面的形式:
Session sess = factory.openSession(); Transaction tx; try { tx = sess.beginTransaction(); //do some work ... tx.commit(); } catch (Exception e) { if (tx!=null) tx.rollback(); throw e; } finally { sess.close(); }
SessionFactory
Method Summary | |
?Transaction | beginTransaction() ??????????開始一個工作單元并且返回相關聯的事務(Transaction)對象。 |
?void | cancelQuery() ??????????終止執行當前查詢。 |
?void | clear() ??????????完整的清除這個session。 |
?Connection | close() ??????????停止這個Session,通過中斷JDBC連接并且清空(cleaning up)它。 |
?Connection | connection() ??????????獲取這個Session的JDBC連接。 如果這個session使用了積極的collection釋放策略(如CMT-容器控制事務的環境下),關閉這個調用的連接的職責應該由當前應用程序負責。 |
?boolean | contains(Object?object) ??????????檢查這個對象實例是否與當前的Session關聯(即是否為Persistent狀態)。 |
?Criteria | createCriteria(Class?persistentClass) ??????????為給定的實體類或它的超類創建一個新的Criteria實例。 |
?Criteria | createCriteria(Class?persistentClass, String?alias) ??????????根據給定的實體類或者它的超類創建一個新的Criteria實例,并賦予它(實體類)一個別名。 |
?Criteria | createCriteria(String?entityName) ??????????根據給定的實體的名稱(name),創建一個新的Criteria實例。 |
?Criteria | createCriteria(String?entityName, String?alias) ??????????根據給定的實體的名稱(name),創建一個新的Criteria實例,并賦予它(實體類)一個別名 |
?Query | createFilter(Object?collection, String?queryString) ??????????根據給定的collection和過濾字符串(查詢條件)創建一個新的Query實例。 |
?Query | createQuery(String?queryString) ??????????根據給定的HQL查詢條件創建一個新的Query實例。 |
?SQLQuery | createSQLQuery(String?queryString) ??????????根據給定的SQL查詢條件創建一個新的SQLQuery實例。 |
?void | delete(Object?object) ??????????從數據庫中移除持久化(persistent)對象的實例。 |
?void | delete(String?entityName, Object?object) ??????????從數據庫中移除持久化(persistent)對象的實例。 |
?void | disableFilter(String?filterName) ??????????禁用當前session的名稱過濾器。 |
?Connection | disconnect() ??????????斷開Session與當前的JDBC連接。 |
?Filter | enableFilter(String?filterName) ??????????打開當前session的名稱過濾器。 |
?void | evict(Object?object) ??????????將當前對象實例從session緩存中清除。 |
?void | flush() ??????????強制提交刷新(flush)Session。 |
?Object | get(Class?clazz, Serializable?id) ??????????根據給定標識和實體類返回持久化對象的實例,如果沒有符合條件的持久化對象實例則返回null。 |
?Object | get(Class?clazz, Serializable?id, LockMode?lockMode) ??????????根據給定標識和實體類返回持久化對象的實例,如果沒有符合條件的持久化對象實例則返回null。 |
?Object | get(String?entityName, Serializable?id) ??????????返回與給定的實體命名和標識匹配的持久化實例,如果沒有對應的持久化實例則返回null。 |
?Object | get(String?entityName, Serializable?id, LockMode?lockMode) ??????????返回與給定的實體類和標識所匹配的持久化實例,如果沒有對應的持久化實例則返回null。 |
?CacheMode | getCacheMode() ??????????得到當前的緩存模式。 |
?LockMode | getCurrentLockMode(Object?object) ??????????檢測給定對象當前的鎖定級別。 |
?Filter | getEnabledFilter(String?filterName) ??????????根據名稱獲取一個當前允許的過濾器(filter)。 |
?EntityMode | getEntityMode() ??????????獲取這個session有效的實體模式。 |
?String | getEntityName(Object?object) ??????????返回一個持久化對象的實體名稱。 |
?FlushMode | getFlushMode() ??????????獲得當前的刷新提交(flush)模式。 |
?Serializable | getIdentifier(Object?object) ??????????獲取給定的實體對象實例在Session的緩存中的標識,如果該實例是自由狀態(Transient)的或者與其它Session關聯則拋出一個異常。 |
?Query | getNamedQuery(String?queryName) ??????????從映射文件中根據給定的查詢的名稱字符串獲取一個Query(查詢)實例。 |
?Session | getSession(EntityMode?entityMode) ??????????根據給定的實體模式(Entity Mode)開始一個新的有效的Session。 |
?SessionFactory | getSessionFactory() ??????????獲取創建這個session的SessionFactory實例。 |
?SessionStatistics | getStatistics() ??????????獲取這個session的統計信息。 |
?Transaction | getTransaction() ??????????獲取與這個session關聯的Transaction(事務)實例。 instance associated with this session. |
?boolean | isConnected() ??????????檢查當前Session是否處于連接狀態。 |
?boolean | isDirty() ??????????當前Session是否包含需要與數據庫同步的(數據狀態)變化 ?如果我們刷新提交(flush)這個session是否會有SQL執行? |
?boolean | isOpen() ??????????檢查當前Session是否仍然打開。 |
?Object | load(Class?theClass, Serializable?id) ??????????在符合條件的實例存在的情況下,根據給定的實體類和標識返回持久化狀態的實例。 |
?Object | load(Class?theClass, Serializable?id, LockMode?lockMode) ??????????在符合條件的實例存在的情況下,根據給定的實體類、標識及指定的鎖定等級返回持久化狀態的實例。 |
?void | load(Object?object, Serializable?id) ??????????將與給定的標示對應的持久化狀態(值)復制到給定的自由狀態(trasient)實例上。 |
?Object | load(String?entityName, Serializable?id) ??????????在符合條件的實例存在的情況下,根據給定的實體類和標識返回持久化狀態的實例。 |
?Object | load(String?entityName, Serializable?id, LockMode?lockMode) ??????????在符合條件的實例存在的情況下,根據給定的實體類、標識及指定的鎖定等級返回持久化狀態的實例。 |
?void | lock(Object?object, LockMode?lockMode) ??????????從給定的對象上獲取指定的鎖定級別。 |
?void | lock(String?entityName, Object?object, LockMode?lockMode) ??????????從給定的對象上獲取指定的鎖定級別。 |
?Object | merge(Object?object) ??????????將給定的對象的狀態復制到具有相同標識的持久化對象上。 |
?Object | merge(String?entityName, Object?object) ??????????將給定的對象的狀態復制到具有相同標識的持久化對象上。 |
?void | persist(Object?object) ??????????將一個自由狀態(transient)的實例持久化。 |
?void | persist(String?entityName, Object?object) ??????????將一個自由狀態(transient)的實例持久化。 |
?void | reconnect() ??????????不推薦的。?手工的重新連接只應用于應用程序提供連接的情況,在這種情況下或許應該使用 reconnect(java.sql.Connection) 。 |
?void | reconnect(Connection?connection) ??????????重新連接到給定的JDBC連接。 |
?void | refresh(Object?object) ??????????從數據庫中重新讀取給定實例的狀態。 |
?void | refresh(Object?object, LockMode?lockMode) ??????????根據指定的鎖定模式(LockMode),從數據庫中重新讀取給定實例的狀態。 |
?void | replicate(Object?object, ReplicationMode?replicationMode) ??????????使用當前的標識值持久化給定的游離狀態(Transient)的實體。 |
?void | replicate(String?entityName, Object?object, ReplicationMode?replicationMode) ??????????使用當前的標識值持久化給定的游離狀態(Transient)的實體。 |
?Serializable | save(Object?object) ??????????首先為給定的自由狀態(Transient)的對象(根據配置)生成一個標識并賦值,然后將其持久化。 |
?Serializable | save(String?entityName, Object?object) ??????????首先為給定的自由狀態(Transient)的對象(根據配置)生成一個標識并賦值,然后將其持久化。 |
?void | saveOrUpdate(Object?object) ??????????根據給定的實例的標識屬性的值(注:可以指定unsaved-value。一般默認null。)來決定執行 save() 或update()操作。 |
?void | saveOrUpdate(String?entityName, Object?object) ??????????根據給定的實例的標識屬性的值(注:可以指定unsaved-value。一般默認null。)來決定執行 save() 或update()操作。 |
?void | setCacheMode(CacheMode?cacheMode) ??????????設置刷新提交模式。 |
?void | setFlushMode(FlushMode?flushMode) ??????????設置刷新提交模式。 |
?void | setReadOnly(Object?entity, boolean?readOnly) ??????????將一個未經更改的持久化對象設置為只讀模式,或者將一個只讀對象標記為可以修改的模式。 |
?void | update(Object?object) ??????????根據給定的detached(游離狀態)對象實例的標識更新對應的持久化實例。 |
?void | update(String?entityName, Object?object) ??????????根據給定的detached(游離狀態)對象實例的標識更新對應的持久化實例。 |
from:http://www.aygfsteel.com/iamtin/archive/2006/03/06/33910.html