Hibernate對象狀態:
臨時(transeint):一般爲new出的對象,與數據庫沒有對應,跟session沒有關聯
持久化(persist):對象在session管理之中,與數據庫對應
特點:有唯一標識符(OID)
對象的改變同步到數據庫
遊離(detached):數據庫中有對應記錄,但對象不再session管理中,修改此狀態對象數據庫不會有變化
刪除(removed):執行了delete()後的對象
狀態間的轉換關係:
session中的方法:
一、操作實體對象的
save() 將臨時狀態變成持久化狀態 insert into...
update()將遊離狀態變成持久化狀態 update...
delete() 將持久化或遊離狀態變成刪除狀態 delete... 如果刪除的對象不存在,會拋出異常
二、查詢實體對象的
get() 獲取數據,持久化狀態 select... 會馬上執行sql語句,如果對象不存在,拋出空指針異常
返回的原始對象
load() 獲取數據,持久化狀態 select... 不會馬上執行sql語句
返回的是代理對象,要求類不能是final,否則不能生成子類代理,就不能使用懶加載
讓懶加載失效的兩種方法:1.類由final修飾,2.在映射文件的class標籤中設置lazy="false",lazy默認爲true
createQuery()
createCriteria()
三、操作緩存的
clear()
evict()
flush()
session大批量保存
@Test
public void testBatchSave(){
Session session=sessionFactory.openSession();
Transaction tx=session.beginTransaction();
//操作
//操作大量數據,防止session中對象過多而發生內存溢出
for(int i=0;i<30;i++){
User user =new User();
user.setName(i+"test");
session.save(user);
if(i%5==0){
session.flush();//先刷新
session.clear(); //再清空
}
}
tx.commit();
session.close();
}