一、工做原理-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 }