1、Hibernate基礎

一、工做原理-ORM
  讀取並解析hibernate.cfg.xml配置文件
  由hibernate.cfg.xml中的<mapping resource="com/**/*.hbm.xml"/>讀取並解析映射信息
  建立SessionFactory
  打開Sesssion
  建立事務Transation
  持久化操做
  提交事務
  關閉Session
  關閉SesstionFactory
二、增刪改查
  session.save(object);
  session.delete(object);
  session.update(object);
  session.createQuery("from class").list();
三、主鍵生成方式
  identity 用於自動生成主鍵,除oracle不支持,其餘數據庫通常都支持
  sequence 用序列生成主鍵,Oracle使用
  native 根據配置文件hibernate.cfg.xml中方言來選擇生成主鍵
    注意:native的時候加上<param name="sequence">foo_seq</param>,MySQL不起做用不會報錯,Oracle就起做用
  increment 不經常使用
  assigned 不經常使用,手動生成id
四、映射類型java

Hibernate映射類型 Java類型  標準SQL類型 大  小 描述
integer Integer/int INTEGER 4字節  
double Double/double DOUBLE 8字節  
big_decimal  Bigdecimal NUMERIC    
String java.lang.String VARCHAR    
boolean/yes_no/true_false Boolean/boolean BIT   布爾類型
date java.util.Date/java.sql.Date DATE   yyyy-MM-dd
time java.util.Date/java.sql.Time TIME   hh:mi:ss
timestamp java.util.Date/java.sql.Timestamp TIMESTAMP   yyyymmddhhmiss

 

 

 

 

 

 

 

五、對象三種狀態sql

  暫時態
    當對象剛建立,未通過session操做,當程序執行完就會當即消失
  持久態
    對象通過session操做,如執行save,get,query等操做
    session會緩存該對象
    session再獲取對象時,首先去查找一級緩存,若是沒有才查詢數據庫
    session負責將持久態對象的變化更新到數據庫中
  遊離態
    調用session.evict(Object)方法和session解除關係
六、一級緩存
  
session級的緩存也叫事務級的緩存,只緩存實體,生命週期和session一致
 
 session負責實時維護緩存中的數據,保證緩存中的數據與數據庫中的數據的一致性,一旦用戶對緩存的數據進行了修改,session當即將數據更新到數據庫中
七、延遲加載
  常見延遲加載的方法:load() iterator()
  爲了使項目在頁面加載完後關閉session,使用ThreadLocal實現OpenSessionInView技術實現頁面加載先後調用同一個session,兩種方式
    a Hibernateutil中本身管理維護ThreadLocal類(推薦)數據庫

 1 import org.hibernate.Session;
 2 import org.hibernate.SessionFactory;
 3 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 4 import org.hibernate.cfg.Configuration;
 5 
 6 public class HibernateUtil {
 7     private static ThreadLocal<Session> tl = new ThreadLocal<Session>();
 8     private static Configuration conf;
 9     private static SessionFactory factory;
10     static {
11       conf = new Configuration().configure();
12       factory = conf.buildSessionFactory(new StandardServiceRegistryBuilder()
13               .applySettings(conf.getProperties()).build());
14     }
15 
16     public static Session openSession() {
17       Session session = tl.get();
18       if (session == null) {
19           session = factory.openSession();
20           tl.set(session);
21       }
22       return session;
23     }
24 
25     public static void closeSession() {
26       Session session = tl.get();
27       if (session != null) {
28           session.close();
29           tl.set(null);
30       }
31     }
32 }

    b 修改hibernate.cfg.xml
      在配置文件中加入一句話,告訴 Hibernate 要使用 ThreadLocal 的方式得到 session
      <property name="current_session_context_class">thread</property>緩存

      HibernateUtil寫法以下session

 1 import org.hibernate.Session;
 2 import org.hibernate.SessionFactory;
 3 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 4 import org.hibernate.cfg.Configuration;
 5 
 6 public class HibernateUtil {
 7     private static Configuration conf;
 8     private static SessionFactory factory;
 9     static {
10         conf = new Configuration().configure();
11         factory = conf.buildSessionFactory(new StandardServiceRegistryBuilder()
12                         .applySettings(conf.getProperties()).build());
13     }
14 
15     public static Session openSession() {
16         return factory.getCurrentSession();
17     }
18 
19     public static void closeSession() {
20         Session session = factory.getCurrentSession();
21         if (session != null) {
22             session.close();
23         }
24     }
25 }
相關文章
相關標籤/搜索