程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Hibernate總結(一),Hibernate總結(

Hibernate總結(一),Hibernate總結(

編輯:JAVA綜合教程

Hibernate總結(一),Hibernate總結(


  • Hibernate為了提高性能,提供了緩存與快照機制。

它的緩存分為一級緩存與二級緩存。

Hibernate一級緩存:當一個事務中執行一次Sql語句時,就將返回的結果存儲在Session中的Map集合中(當然,還有快照)。

  • 測試:(以下所有代碼處於try/catch塊中)
     Configuration config=new Configuration().configure();//configure()方法是加載src/hibernate.cfg.xml配置文件
        SessionFactory sf=config.buildSessionFactory();
        Session s=sf.openSession();//Session是高一級的對Connection的封裝
        Transaction tran=null;
        try {
            tran=s.beginTransaction();
            
            //代碼在此
tran.commit(); } catch (HibernateException e) { if(tran!=null){ tran.rollback(); } e.printStackTrace(); } finally{ s.close(); sf.close(); }
  • 查詢:包括get(),load(),原生Sql,HQL,Criteria(比HQL更面向對象的一種查詢方式)
        //1.get(),load()方法測試
            User u=(User) s.get(User.class, 1);//第一次查詢生成SQL語句,並將結果放入緩存
            User u1=(User) s.get(User.class, 1);//第二次查詢並無生成SQL語句,但結果取自緩存
            p(u==u1);//true
//2.HQL查詢 Query q=s.createQuery("from domain.User where id=1"); User u2=(User) q.uniqueResult();//第三次查詢生成了SQL語句,但結果取自緩存 p(u2==u);//true
//3.原生Sql SQLQuery q1=s.createSQLQuery("select * from User where id=1"); q1.addEntity(User.class); User u3=(User) q1.uniqueResult();//第四次查詢生成了SQL語句,但結果取自緩存 p(u3==u);//true
//4.Criteria查詢 Criteria c=s.createCriteria(User.class); c.add(Restrictions.eq("id", 1)); User u4=(User) q1.uniqueResult();//第五次查詢生成了SQL語句,但結果取自緩存 p(u4==u);//true

總結查詢:

  get(),load() 原生Sql,HQL,Criteria Sql語句的緩存 √

X

查詢對象的緩存 √ √
  • 增加:save(),persist()
            User user = new User();//對象的瞬態
                user.setName("xiaobai");
                user.setAge(121);
                s.save(user);//對象的持久態
          s.persist(user);

這裡兩個方法的區別是:執行方法之前設置主鍵問題與執行方法之後返回主鍵問題。

1,persist(),把一個瞬態的實例持久化,但是並"不保證"標識符(identifier主鍵對應的屬性)被立刻填入到持久化實例中,標識符的填入可能被推遲到flush的時候。

2,save(), 把一個瞬態的實例持久化標識符,及時的產生,它要返回標識符,所以它會立即執行Sql insert。

                User u = new User();
                u.setName("xiaobai");
                u.setAge(121);
                s.save(u);//插入數據庫,並將對象瞬態轉為持久態,將返回對象存入緩存
                User u1=(User) s.get(User.class, u.getId());//這次查詢沒有生成SQL語句,結果取自Session的緩存
                p(u1==u);//true
  • 刪除:delete()
User u=(User) s.get(User.class, 10);//執行查詢操作
s.delete(u);//將對象持久態轉為游離態

當然,如果感覺為了刪除一個數據,還的執行查詢操作降低性能,可以這樣:

User u=new User();
u.setId(5);
s.delete(u);
  • 更新:update()
User u=(User) s.get(User.class, 1);
u.setName("set");

但有時候,我們不需要執行s.update(對象)方法,這這涉及到對象的持久態一個特性(也有【快照】作用其中):

當對象為持久態時,當它更新數據時,框架會拿它與之前的快照作比較,若相同,則無動作;若不同,則自動更新至數據庫。

//當然,也可以這麼做
User u=new User();//對象的瞬態,不具備自動更新功能,需要我們手動update() u.setAge(1); u.setId(1); u.setName("1"); s.update(u);
  • 總結:

有一點非常重要:在事務中雖然形成了Sql語句,但只有事務.commit()之後才會真正操作數據庫。

Hibernate關於數據庫的操作,需要弄清楚【緩存,快照,對象三態】等等些許東西。

對象三態:

* 瞬時態:和hibernate沒關聯,在數據庫表中沒有對應的id
* 持久態:和hibernate有關聯,在數據庫表中有對應的id---OID
* 游離態:和hibernate沒關聯,在數據庫表中有對應的id

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved