1.持久化類提供無參數構造
2.成員變量私有,提供get、set方法訪問,需提供屬性(屬性就是get、set方法)
3.持久化類中的屬性,應儘可能使用包裝類型(能夠表示null,在插如數據庫中有做用)
4.持久化類須要提供oid(主鍵屬性)與數據庫中主鍵列對應
5.不須要final修飾class(緣由:hibernate使用cglib代理生成代理對象,若是被final修飾將沒法生成代理)mysql
1.天然主鍵(少見)算法
表的業務列中,有某業務列符合,必須有且不重複的特徵時,該列能夠做爲主鍵使用
2.代理主鍵(常見)sql
表的業務列中,沒有某業務列符合,必須有且不重複的特徵時,建立一個沒有業務意義的列作爲主鍵
1.代理主鍵數據庫
indentity:主鍵自增,有數據庫來維護主鍵值,錄入時不須要指定主鍵 sequence:Oracle中的主鍵生成策略 increment(瞭解):主鍵自增,由hibernate來維護,每次插入前會先查詢表中的id的最大值,+1做爲新主鍵插入 hilo(瞭解):高低位算法,主鍵自增,有hibernate來維護,開發時不使用 native:hilo + sequence + indeyity 自動三選一策略 uuid:產生隨機字符串做爲主鍵,主鍵類型必須爲String類型
2.天然主鍵緩存
assigned:天然主鍵生成策略,hibernate不會管理主鍵值,由開發人員本身錄入
1.瞬時狀態session
沒有id,沒有與session關聯
2.持久化狀態併發
有id,與session有關聯
3.遊離|託管狀態函數
有id,沒有與session關聯
代碼ui
@Test public void save() { Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer c = new Customer(); // 沒有id,沒有與session對象關聯 => 瞬時狀態 session.save(c); // 持久化狀態,有id,與session對象關聯 tx.commit(); session.close(); // 遊離|託管狀態,有id,沒有關聯 }
三種狀態的轉換圖spa
緩存:提升效率,hibernate中的一級緩存也是爲了提升操做數據庫的效率
事務特性
a原子性 c一致性 i隔離性(事務併發的時候隔離級別) d持久性
事務併發問題
一、髒讀 二、不可重複讀 三、幻、虛讀
事務的隔離級別
讀未提交:出現的問題一、二、3 讀已提交:出現的問題二、3 可重複讀:出現的問題3(mysql默認級別) 串行化:沒有問題,會極大的下降效率
如何在hibernate中指定隔離級別
在hibernate主配置中 <!--specify a JDBC isolation level--> hibernate.connection.isolation 1|2|4|8 數據庫中存儲級別是一個字節 0001 1 讀未提交 0010 2 讀已提交 0100 4 可重複讀 1000 8 串行化
項目中如何管理事務
業務開始以前打開事務,業務執行以後提交事務,執行過程當中出現異常,回滾事務 在dao層操做數據庫須要用到session對象,在service控制事務也是使用session對象完成,咱們要確保dao層和service層使用的是同一個session對象 在hibernate中確保使用同一個session的問題,hibernate已經幫咱們解決了,咱們開發人員只須要調用sf.getCurrentSession()方法得到與當前線程綁定的session對象 注意:調用getCurrentSession()方法必須配合主配置中的一項配置,以下 指定session與當前線程綁定 hibernate.current_session_context_class thread 經過getCurrentSession()方法得到session對象,當事務提交時session會自動關閉,不須要手動close關閉
HQ查詢-hibernate Query Language(支持多表查詢,但通常是不復雜時使用)
// 一、書寫HQL語句 String hql = "form Customer"; // 查詢全部的Customer對象 // 二、根據HQL語句建立查詢對象 Query query = session.createQuery(hql); // 三、根據對象得到查詢結果 List<Customer> list = query.list(); // 返回list結果 // query.uniqueResult();//返回惟一的查詢結果 // ?佔位符 String hql = "form Customer where cus_id = ?"; // 查詢全部的Customer對象 //設置參數 session.setParamter(0, 1)// hibernate ?佔位符索引從0開始,jdbc從1開始 // :佔位符 String hql = "form Customer where cus_id = :cus_id"; session.setParamter("cus_id", 1)// hibernate :佔位符直接輸入佔位名字 // 分頁查詢 query.setFirstResult(0);// 第一條數據開始的位置,0是索引 query.setMaxResult(20);// 設置查詢結果最大條數,想當與pagesize
Criteria查詢-hibernate自創的無語句查詢(單表查詢)
Criteria criteria = session.createCriteria(Customer.calss); //查詢全部的Customer對象 List<Customer> list = criteria.list();// 返回list結果 // criteria.uniqueResult();// 返回惟一查詢結果 // 條件查詢 // > gt // >= ge // < lt // <= le // == eq // != ne // in in // between and between // like like // is not null isNotNull // is null isNull // or or // and and criteria.add(Restrictions.eq("cus_id", 1))// 查詢cus_id爲1的對象 // 聚合函數 criteria.setProjection(Projections.rowCount);// count函數 // 分頁查詢 criteria.setFirstResult(0);// 第一條數據開始的位置,0是索引 criteria.setMaxResult(20);// 設置查詢結果最大條數,想當與pagesize
原生SQL查詢(複雜業務查詢)
// 書寫sql語句 String sql = "select * from customer"; // 建立sql查詢對象 SQLQuery query = session.createSQLQuery(sql); // 指定結果集封裝到指定對象中 query.addEntity(Customer.class); // 調用方法查詢結果 List<Customer> list = query.list();