雜文
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>