標籤:style c class blog code java
1、工作原理-ORM
讀取並解析hibernate.cfg.xml設定檔
由hibernate.cfg.xml中的<mapping resource="com/**/*.hbm.xml"/>讀取並解析映射資訊
建立SessionFactory
開啟Sesssion
建立事務Transation
持久化操作
提交事務
關閉Session
關閉SesstionFactory
2、增刪改查
session.save(object);
session.delete(object);
session.update(object);
session.createQuery("from class").list();
3、主鍵產生方式
identity 用於自動產生主鍵,除oracle不支援,其他資料庫一般都支援
sequence 用序列產生主鍵,Oracle使用
native 根據設定檔hibernate.cfg.xml中方言來選擇產生主鍵
注意:native的時候加上<param name="sequence">foo_seq</param>,MySQL不起作用不會報錯,Oracle就起作用
increment 不常用
assigned 不常用,手動產生id
4、映射類型
| 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 |
5、對象三種狀態
暫時態
當對象剛建立,未經過session操作,當程式執行完就會立即消失
持久態
對象經過session操作,如執行save,get,query等操作
session會緩衝該對象
session再擷取對象時,首先去尋找一級緩衝,如果沒有才查詢資料庫
session負責將持久態對象的變化更新到資料庫中
游離態
調用session.evict(Object)方法和session解除關係
6、一級緩衝
session級的緩衝也叫事務級的緩衝,只緩衝實體,生命週期和session一致
session負責即時維護緩衝中的資料,保證緩衝中的資料與資料庫中的資料的一致性,一旦使用者對緩衝的資料進行了修改,session立即將資料更新到資料庫中
7、消極式載入
常見消極式載入的方法: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寫法如下
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 }