規(guī)范:
1.屬性私有化,提供get/set方法 - 只有提供了get/set方法的成員變量才是屬性
2.提供無參構造器
3.基本數(shù)據(jù)類型建議使用包裝類
4.必須有主鍵oid對應屬性
5.不能用final修飾 :hibernate使用cglib代理生成代理對象。代理對象是繼承被代理對象。如果類被final修飾,將無法生成代理對象.
<generator class="主鍵生成策略"><!-- <param name="sequence"></param> --> </generator>
主鍵種類:
1.代理主鍵:業(yè)務無關,對象無關 - 項目開發(fā)中常使用該類型
2.自然主鍵:表中存在非空且唯一的字段,例如身份證號
主鍵生成策略:
1.代理主鍵的生成策略:
identity:數(shù)據(jù)庫來維護,自增長,不需要手動錄入
sequence:數(shù)據(jù)庫維護,seq.nextVal,適用于Oracle數(shù)據(jù)庫的序列方式,需要指定參數(shù)(序列名),不需要手動輸入
increment:Hibernate維護,自增長,不需要錄入,在插入之前會查找數(shù)據(jù)中id最大值, 1后插入
hilo:自增長算法
native:hilo identity sequence 自動檢測
uuid:hibernate維護,32位,id類型設置為varchar(32)以上
2.自然主鍵的生成策略:
assigned:必須手動錄入
1.瞬時狀態(tài):對象沒有id,并且沒有和session關聯(lián)
2.持久化狀態(tài):對象有id,并且和session關聯(lián)
-------------------內(nèi)容發(fā)生修改,在事務提交時,都會同步到數(shù)據(jù)庫
3.游離|托管狀態(tài):對象有id,并且沒有和session關聯(lián)
*ID:和數(shù)據(jù)庫對比,如果數(shù)據(jù)庫中有改id,則為有效ID,數(shù)據(jù)庫中不存在,則為無效id
public void test02() { Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); // c - 瞬時狀態(tài) Customer c = new Customer(); c.setCust_name("新浪"); System.out.println(c);//此時c對象沒有id,并且與session沒有關聯(lián) session.save(c);//c對象擁有id // c - 持久化狀態(tài) System.out.println(c);//c對象有id,并且與session關聯(lián) tx.commit(); session.close(); // c - 游離狀態(tài) System.out.println(c); }
public void test03() { Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer c = session.get(Customer.class, 1l); // c - 持久化狀態(tài) System.out.println(c); tx.commit(); session.close(); // c - 游離狀態(tài) System.out.println(c);//c有id,但是和session沒有關聯(lián) }
public void test04() { Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer c = session.get(Customer.class, 3l); // c - 持久化狀態(tài) System.out.println(c); session.delete(c); // -- 沒打印 System.out.println(c); tx.commit(); // -- 執(zhí)行sql語句 session.save(c); session.close(); }
public void test05() { Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer c = session.get(Customer.class, 2234236l); // c - 持久化狀態(tài) System.out.println(c); c.setCust_linkman("王總"); // session.update(c); //處于持久化狀態(tài)對象內(nèi)容發(fā)生修改,在事務提交時,都會同步到數(shù)據(jù)庫 tx.commit(); session.close(); }
public void test06() { Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); // 游離狀態(tài) Customer c = new Customer(); c.setCust_id(7l);//數(shù)據(jù)庫存在該id,但是c與session沒有關聯(lián) c.setCust_name("阿里媽媽");// session.update(c); session.saveOrUpdate(c); tx.commit(); session.close(); }
session是有緩存的,
load:默認懶加載,使用對象時,彩之星sql語句,變成真正的對象
1.事務特性:原子性、一致性、隔離性、持久性
2.事務并發(fā)問題:臟讀1、不可重復讀2、幻讀3
3.事務的隔離級別:讀未提交123、讀已提交23、可重復讀3、串行化
1.在Hibernate中設置事務隔離級別
<!--設置事務隔離級別 hibernate.connection.isolation 4(1|2|4|8) 0001 1 讀未提交 0010 2 讀已提交 0100 4 可重復讀 1000 8 串行化 --> <property name="hibernate.connection.isolation">4</property>
2.在項目中管理事務
1.業(yè)務開始之前打開事務,業(yè)務執(zhí)行之后–提交事務 執(zhí)行過程中出現(xiàn)異常–回滾事務
2.在dao層操作數(shù)據(jù)庫需要用到session對象。在service控制事務也是使用session對象完成. 確保dao層和service層使用的同一個session對象
3.在hibernate中,確保使用同一個session的問題,hibernate已經(jīng)幫我們解決了. 我們開發(fā)人員只需要調(diào)用sf.getCurrentSession()方法即可獲得與當前線程綁定的session對象
注意1: 調(diào)用getCurrentSession方法必須配合主配置中的一段配置
注意2:通過getCurrentSession方法獲得的session對象.當事務提交時,session會自動關閉.不要手動調(diào)用close關閉.
<!--將session與當前線程綁定 --> <property name="current_session_context_class">thread</property>
4.crm項目中:
service層: