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

采用get加載數據,如果數據庫中不存在相應的數據,返回null

在刪除和修改時,一般都先將要操作的數據加載上之后再進行刪除和修改。

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


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

hibernate基本映射

實體類---表
實體類中的普通屬性---表字段

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

注意:如果實體類和實體類中的屬性和sql中的關鍵字重復,必須采用table或column重新命名

實體類的設計原則:
 * 實現一個默認的(即無參數的)構造方法(constructor)
 * 提供一個標識屬性(identifier property)(可選)
 * 使用非final的類 (可選)
 * 為持久化字段聲明訪問器(accessors) 

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


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

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


hibernate二級緩存

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

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

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

采用編程式事務

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