雜文
Session 是非線程安全的
所以一個(gè)業(yè)務(wù)請求來就打開一個(gè)session 用完就立即關(guān)閉

采用get加載數(shù)據(jù),如果數(shù)據(jù)庫中不存在相應(yīng)的數(shù)據(jù),返回null

在刪除和修改時(shí),一般都先將要操作的數(shù)據(jù)加載上之后再進(jìn)行刪除和修改。

get和load只能根據(jù)主鍵加載,如要使用別的方式 則需借助HQL查詢


查詢時(shí) from后面區(qū)分大小寫(對應(yīng)的是實(shí)體類 而不是表名)

hibernate基本映射

實(shí)體類---表
實(shí)體類中的普通屬性---表字段

采用<class>標(biāo)簽映射成數(shù)據(jù)庫表,通過<property>標(biāo)簽將普通屬性映射成表字段
所謂普通屬性指不包括自定義類、集合和數(shù)組等

注意:如果實(shí)體類和實(shí)體類中的屬性和sql中的關(guān)鍵字重復(fù),必須采用table或column重新命名

實(shí)體類的設(shè)計(jì)原則:
 * 實(shí)現(xiàn)一個(gè)默認(rèn)的(即無參數(shù)的)構(gòu)造方法(constructor)
 * 提供一個(gè)標(biāo)識屬性(identifier property)(可選)
 * 使用非final的類 (可選)
 * 為持久化字段聲明訪問器(accessors) 

主鍵生成策略:
 uuid、native和assigned


hibernate一級緩存
 
一級緩存很短和session的生命周期一致,一級緩存也叫session級的緩存或事務(wù)級緩存

那些方法支持一級緩存:
 * get()
 * load()
 * iterate(查詢實(shí)體對象)
 
如何管理一級緩存:
 * session.clear(),session.evict()
 
如何避免一次性大量的實(shí)體數(shù)據(jù)入庫導(dǎo)致內(nèi)存溢出
 * 先flush,再clear
 
如果數(shù)據(jù)量特別大,考慮采用jdbc實(shí)現(xiàn),如果jdbc也不能滿足要求可以考慮采用數(shù)據(jù)本身的特定導(dǎo)入工具     


hibernate二級緩存

二級緩存也稱進(jìn)程級的緩存或SessionFactory級的緩存,二級緩存可以被所有的session共享
二級緩存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二級緩存

二級緩存的配置和使用:
 * 將echcache.xml文件拷貝到src下
 * 開啟二級緩存,修改hibernate.cfg.xml文件
  <property name="hibernate.cache.use_second_level_cache">true</property>
 * 指定緩存產(chǎn)品提供商,修改hibernate.cfg.xml文件
  <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
 * 指定那些實(shí)體類使用二級緩存(兩種方法)
  * 在映射文件中采用<cache>標(biāo)簽
  * 在hibernate.cfg.xml文件中,采用<class-cache>標(biāo)簽
  
二級緩存是緩存實(shí)體對象的

了解一級緩存和二級緩存的交互  
  

采用編程式事務(wù)

1、getCurrentSession()與openSession()的區(qū)別?
 * 采用getCurrentSession()創(chuàng)建的session會(huì)綁定到當(dāng)前線程中,而采用openSession()
   創(chuàng)建的session則不會(huì)
 * 采用getCurrentSession()創(chuàng)建的session在commit或rollback時(shí)會(huì)自動(dòng)關(guān)閉,而采用openSession()
   創(chuàng)建的session必須手動(dòng)關(guān)閉
  
2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
 * 如果使用的是本地事務(wù)(jdbc事務(wù))
 <property name="hibernate.current_session_context_class">thread</property>
 * 如果使用的是全局事務(wù)(jta事務(wù))
 <property name="hibernate.current_session_context_class">jta</property>