1. 程式人生 > >Hibernate註意項

Hibernate註意項

查詢 fig integer incr 需要 creat 檢測 查詢語句 持久

Hibernate實體規則

1.持久化類提供無參數構造

2.成員變量私有,提供getset訪問,提供實行

3.持久化類屬性,盡量使用包裝類型

4.持久化類需要提供oid與數據庫中的主鍵列對應

5.不要使用final修飾class

實體類創建的註意事項

主鍵類型:

  自然主鍵(少見):表的業務列中,有某項業務列符合,必須有,並且不重復的特征時,該列可以作為主鍵使用

  代理主鍵(常見):創建一個無意義的列作為主鍵

主鍵生成策略:

<!-- generator 主鍵生成策略 
     identity:主鍵自增,由數據庫來維護主鍵值,錄入時不需要指定主鍵
     increment(不用):主鍵自增,由hibernate來維護,每次插入會先查詢表中最大值,
+1做為主鍵值(多人同時插入時會導致數據丟失) sequence:Oracle中的主鍵生成策略 hilo:高低位算法,數據庫屬性自增的算法,由hibernate來維護,與increment不一樣,這個hilo算法能夠保證數據庫主鍵永遠不一樣
   
native:hilo+sequence+identity三選一策略,檢測到非oracle支持主鍵自增,那選擇identity,檢測到是oracle,選擇sequence
自增的方法,hilo遇到不支持自增不支持sequence,市面目前沒有這種數據庫uuid:產生一個隨機字符串作為主鍵

-->

<generator class="native">

</generator>

對象狀態:

  對象分為三種狀態:

    瞬時狀態:沒有id,沒有與session關聯

    持久化狀態:有id,與session有關聯

    托管狀態:有id,沒有與session關聯

  

package com.littlepage.state;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.littlepage.entity.Customer;

public class Demo { public static void main(String[] args) { Configuration conf=new Configuration().configure(); SessionFactory sf=conf.buildSessionFactory(); Session session=sf.openSession(); Transaction tx=session.beginTransaction(); Customer cus=new Customer();//沒有id,沒有與session關聯=瞬時狀態 cus.setName("Poly");//瞬時 cus.setAge(15); session.save(cus);//持久化狀態 tx.commit(); session.close();//遊離狀態 sf.close(); } }

瞬時-->持久化-->托管

狀態流程

進階-一級緩存:

一級緩存提高數據庫操作的效率。

緩存:暫時存儲在內存上。第一次接觸是在IO流裏面,緩存的目的是為了提高效率。(預加載)

HQL查詢語句:

     Configuration conf=new Configuration().configure();
        SessionFactory sf=conf.buildSessionFactory();
        Session session=sf.openSession();
        Transaction tx=session.beginTransaction();
        //1.書寫HQL語句
        String hql="from Customer where age=15";//查詢所有Customer對象
        //2.根據HQL語句創建查詢對象
        Query query=session.createQuery(hql);
        //3.返回list結果
        List<Customer> list=query.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        
        tx.commit();
        session.close();//遊離狀態
        sf.close();
        
     ?占位符查詢
     //1.書寫HQL語句 String hql="from Customer where age=?";//查詢所有Customer對象 //2.根據HQL語句創建查詢對象 Query query=session.createQuery(hql); //設置參數 query.setInteger(0, 15);
        
     命名占位符查詢
     //1.書寫HQL語句 String hql="from Customer where age=:age";//查詢所有Customer對象 //2.根據HQL語句創建查詢對象 Query query=session.createQuery(hql); //設置參數 query.setParameter("age", 15);
        分頁查詢
//1.書寫HQL語句 String hql="from Customer";//查詢所有Customer對象 //2.根據HQL語句創建查詢對象 Query query=session.createQuery(hql); //設置分頁信息 query.setFirstResult(3);//起始值索引 query.setMaxResults(2);//每頁的多少
        Criteria查詢
        Criteria criteria=session.createCriteria(Customer.class);
        List<Customer> list=criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }            
        約束條件
        Criteria criteria=session.createCriteria(Customer.class);
        criteria.add(Restrictions.eq("age", 12));
        List<Customer> list=criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }    
        聚合函數查詢
Criteria criteria=session.createCriteria(Customer.class); criteria.setProjection(Projections.rowCount()); Long count=(Long)criteria.uniqueResult(); System.out.println(count);
        //原生SQL查詢
        String sql="select * from t_customer";
        SQLQuery query=session.createSQLQuery(sql);
        List<Object[]> list = query.list();
        for (Object[] objects : list) {
            for (Object objects2 : objects) {
                System.out.print(objects2+"\t");
            }
            System.out.println();
        }
        //原生SQL查詢2
        String sql="select * from t_customer";
        SQLQuery query=session.createSQLQuery(sql);
        query.addEntity(Customer.class);
        List<Customer> list=query.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }

分別在什麽情況下進行使用

HQL查詢:查詢多表查詢,不是復雜多表使用

Creteria查詢:單表查詢

SQL原生查詢:復雜的業務查詢

Hibernate註意項