持久化:將內存中的一個對象持久化到數據庫中的過程
持久化類:一個Java對象與數據庫的表創建了映射關係,那麼這個類在hibernate中稱爲持久化類
能夠這麼理解:持久化類=Java類+映射文件mysql
持久化類的編寫規則
1 對持久化類提供一個無參的構造方法
2 屬性須要私有,對私有屬性提供get和set方法
3 對持久化類提供一個惟一標識Oid與數據庫中主鍵對應
4 持久化類中屬性儘可能使用包裝類類型
5 持久化類不要使用final進行修飾sql
先介紹一下主鍵的分類:天然主鍵和代理主鍵
天然主鍵:主鍵的自己就是表中的一個字段(試題中的一個具體的屬性 身份證號)
代理主鍵:主鍵的自己不是表中必須的一個字段(不是實體中某個具體的屬性)
在實際開發中,儘可能使用代理主鍵
爲何不推薦使用天然主鍵,由於一旦天然主鍵參與到業務邏輯中,後期可能修改源代碼
好的程序設計知足OCP原則:對程序的擴展是open的。對修改源代碼是close的數據庫
主鍵生成策略(記住):
increment hibernate中提供的自動增加機制,單線程可使用,多線程不能夠
identity 使用的是數據庫底層的自動增加機制(適用於MySQL SQL server,可是Oracle不適合)
sequence 採用的是序列的方式(適用於Oracle,MySQL就不適用)】
uuid 適用於字符串類型的主鍵
native 本地策略 ,能夠在identity和sequence之間進行自動轉換
assigned hibernate放棄外鍵的管理編程
結合不一樣的狀況去使用
編程中遇到的問題
沒有寫自動生成語句的配置 ,致使hibernate不能爲你建立表緩存
<property name="hibernate.hbm2ddl.auto">update</property>
hibernate是持久層框架,經過持久化類完成ORM操做。Hibernate爲了更好的管理持久化類
將其分爲三種:瞬時態、持久態、託管態
瞬時態:這種對象沒有惟一的標識OID,沒有被session管理
持久態:這種對象有惟一標識OID,被session管理
託管態:這種對象有惟一標識OID,沒有被session管理
下面代碼演示:這段程序包含了持久化的三種狀態session
public class TestDemo2 { @Test public void demo1(){ Session session = HibernateUtils.openSession(); Transaction beginTransaction = session.beginTransaction(); Customer customer=new Customer(); customer.setCust_name("王六");//瞬時態對象。沒有惟一標識的OID,沒有session管理 Serializable id = session.save(customer);//持久態對象。有了惟一標識的OID,調用了session beginTransaction.commit(); session.close(); System.out.println(customer.getCust_name());//託管態對象。有惟一標識的OID,session被銷燬了 } }
咱們重點研究的是持久態對象,
持久化類的持久態對象,能夠自動更新數據庫。多線程
@Test //持久態對象自動更新數據庫 public void demo2(){ Session session = HibernateUtils.openSession(); Transaction beginTransaction = session.beginTransaction(); //得到持久態對象 Customer customer = session.get(Customer.class, 1l); customer.setCust_name("小紅"); beginTransaction.commit(); session.close(); }
咱們能夠看出並手動調用update方法,Hibernate就能夠自動更新數據庫了,持久態之因此有這樣的功能主要依賴於他的一級緩存oracle
什麼是緩存:是一種優化的方式,將數據存放到內存中,使用的時候直接從緩存中去取
優化手段:緩存、抓取策略
一級緩存稱爲是session級別的緩存,生命週期和session一致。框架
事務:指的是邏輯上的一組操做,組成這組操做的邏輯單元要麼所有成功,要麼所有失敗
事務的四個特性:原子性、一致性、隔離性、持久性ide
實際開發中,不會選擇最高或者最低隔離級別,選擇Read committed(oracle默認),Repeatable read(mysql默認)。
Hibernate解決service的事務管理
1.在工具類中更改getCurrentSession方法
public static Session getCurrentSession(){ return sessionFactory.getCurrentSession(); }
2.在覈心配置文件中進行以下配置
<!-- 配置session綁定當前線程 --> <property name="hibernate.current_session_context_class">thread</property>
1.Query
//條件查詢 String hql="from Customer where cust_name like ?"; Query createQuery = session.createQuery(hql); createQuery.setParameter(0, "王%");
//分頁查詢 String hql="from Customer"; Query createQuery = session.createQuery(hql); createQuery.setFirstResult(0); createQuery.setMaxResults(2);
2.Criteria
//分頁查詢 Criteria criteria = session.createCriteria(Customer.class); criteria.setFirstResult(3); criteria.setMaxResults(2);
Criteria更加的面向對象。