一 Hibernate開發流程
1.hibernate需要的三個條件
(1)domian類
(2)映射文件 User.hbm.xml
(3)創建表
2.開發流程
(1)站在面向對象的角度
由domain Object---àmapping ---àdb(官方推薦)
(2)站在關系模型的角度
由DB開始,用工具生成mapping和Domain object(使用較多)
(3)從映射文件開始寫(用的較少)
注:以上任何兩個都可以互相生成
二 開發中的細節
1.Domian Object限制(實體類對象限制)
(1)默認的構造是必須的,如果寫了一個有參數的構造,必須要寫上無參構造
原因是Hibernate會用反射的機制生成一個class對象,創建對象的時候用newInstance()方法去創建,用的是無參構造,例:
Class clazz = User.class;
User user = clazz.newInstance();
(2)有無意義的標識符id(主鍵)(可選)
在實際中用到,如果有id,會充分發揮它的特性
(3)非final的,對懶加載有影響(可選)
懶加載內部會自動的創建一個子類,如果是final,懶加載會有影響
2.映射文件 --- 把類映射成二維表
(1)一個java類在映射文件中用一對<class>標簽表示,如果有多個java類,那麼在映射文件中應該有多個<class>標簽
(2)對於<class>標簽來說,<clas>標簽可以放到一個映射文件中,可以放到多個映射文件中
(3)映射文件的命名規范:類名.hbm.xml
三 代碼編寫
(1)HibernateUitl 工具類 -- 提取和數據庫連接的寶貴資源
public final class HibernateUtil {
private static SessionFactory sessionFactory;
private HibernateUtil() {
}
//耗時資源放到代碼塊中,只執行一次
static {
Configuration cfg = new Configuration();
cfg.configure();// 用來完成Hibernate的初始化---用來讀取配置文件中的信息,可以指定配置文件的位置
// cfg.configure("");
// 得到sessionFactoroy的工廠對象,相當於DirverManager,
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() {
return sessionFactory.openSession();
}
}
(2)添加用戶 --- 使用上面的工具類優化代碼
public static void addUser1(User user) {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();// 開啟事務
session.save(user);
tx.commit();
} finally {
// 使資源得到釋放
if (session != null) {
session.close();
}
}
}
(3)查詢用戶
//查 ---查詢不用開啟事務,不修改數據庫中的東西
public static User getUser(int id){
Session session = null;
try {
session = HibernateUtil.getSession();
Class clazz = User.class;//通過映射文件查找class對象
//User user = (User) session.load(clazz, id);//懶加載,運行後沒有立刻訪問相應的數據庫,返回的是代理對象,永遠不可能為空,當第一次使用該對象的時候,才去訪問
User user = (User) session.get(clazz, id);
return user;
} finally {
// 使資源得到釋放
if (session != null) {
session.close();
}
}
}
四 session接口中的方法
Transation beginTransaction() 開啟事務
Void clear() 清除緩存
Connection close() 關閉session釋放資源的方法
Session只能按id查詢,所以有了:
Criteria createCirteria(Class persistentClass) 查詢所有...
Query createQuert(String queryString)
void delete(Object object)
Object load(Class theClass,Serializable id) 懶加載,當調用的時候,不是立刻去查數據庫,只有第一次使用的時候才去查
Void persist(Object object) 保存對象
Void save(Object object) 保存對象 兩者不同是:
在沒有開啟事務的時候,persist插入的語句沒有做,而save插入的操作確做了,可是回滾了
五 對象狀態
1.瞬時狀態:自己new出來的對象就是瞬時狀態
User user =new User() ;
user是一個瞬時對象,在數據庫的表中沒有記錄和瞬時對象想對應的,也不管理瞬時 對象
當調用 session.save(user)方法之後,為持久狀態
2.持久狀態:數據庫表中有記錄和這個對象相對應的,當持久態的對象發生變化的時候,session中也變化
3.脫管狀態:數據庫的表中有一條記錄和對象相對應的,並且這個對象不被session管理,但是在數據庫表中有記錄和它相對應,當對象再發生變化的時不會改變
當對象處於脫管狀態的時候,又更新了數據庫中的值,要調用更新的方法來通知Hibernate