91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hibernate三種狀態和Session常用的方法

發布時間:2020-08-25 20:30:52 來源:腳本之家 閱讀:116 作者:尋找現實扭曲力場 欄目:編程語言

我們知道hibernate的核心就是對數據庫的操作,里面的核心接口就是org.hibernate.Session接口。要想對數據庫操作我們就要理清楚對象在整個操作中的所屬的狀態(Transient,Persistent,Detached)。就像馬士兵老師在視頻中所說的,我們并不必死摳這些字眼,我們通過自己編寫測試類就可以他們之間不同的區別。

其實三種狀態各自的不必總結那么多,只是一個重要的地方就是Transient狀態里面的對象是沒有id的。

Hibernate三種狀態和Session常用的方法

session中常用的方法是save(),update(),saveOrUpdate(),get(),load(),delete(),clear(),flush()這些

其中大學期間我其實對get和load方法都不是太熟悉,死記硬背才在考試中答題,現在想起完全沒有這個必要。我們可以根據配置好的hibernate環境來進行junit測試。

首先我們進行get()方法進行測試。

這里我們首先建立一個實體類,StudentEntity.Java 和數據庫中student所對應

package com.cwnu.entities; 
import javax.persistence.*; 
import java.io.Serializable; 
/** 
 * Created by yangy on 2015/12/19. 
 */ 
@Table(name = "student") 
@Entity 
public class StudentEntity implements Serializable{ 
 private int id; 
 private String name; 
 @Id 
 @Column(name = "id") 
 @GeneratedValue(strategy = GenerationType.AUTO) 
 private int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 @Column(name = "name") 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
} 

junit類都是idea編譯環境給我們配置好了,這里我們要注意,要使用getCurrentSession()來操作的話,我們首先要在Junit類中加上@Transaction注解,下面是相關的測試方法:

 @Test 
public void testGetOrLoad() { 
 Session session = sessionFactory.getCurrentSession(); 
 StudentEntity student = (StudentEntity)session.get(StudentEntity.class, 1); 
 //StudentEntity student_load = (StudentEntity)session.load(StudentEntity.class,1); String name = student.getName(); 
} 

先測試get方法,我們發現一旦我們只是拿student這個實體操作,get方法是會輸出相關的sql查詢語句的,而我們注釋掉get方法,換load方法的話,load方法執行拿student這個實體的數據是沒有輸出相應的sql語句的。但是我們在對student類進行操作的時候,這時才輸出相關的語句.

所以我們看出get()和load()之間的差別:

get()每次執行都會執行sql語句,不會延遲。load()方法只是會在我們對拿到的實體進行操作的時候才去執行查詢,拿到相應的實體信息。load方法返回的是一個代理對象(馬士兵老師視頻)。無論是get還是load首先都會查一級緩存(session)中有沒有相應的對應值,如果沒有,再去數據庫進行查找。

clear()方法是對session里面的緩存進行了清理,測試這個方法我們可以根據下面的Junit進行測試:

@Test 
 public void testClear() { 
  Session session = sessionFactory.getCurrentSession(); 
  session.get(StudentEntity.class,1); 
  session.clear(); 
  session.get(StudentEntity.class,1); 
 } 

如果我們把session.clear()注釋掉的話,我們就可以看到只執行了一條sql語句

flush()方法是是對數據庫同步的一條語句,執行完這個后立即刷新到數據庫。粗淺的來看哈,其實里面還是有很多東西,比如FlushMode這個類,我們默認設置的是FlushMode.AUTO,這個一般不修改,只是為了以后的性能調優。其實我們在執行事務的時候,事務完成之后它會幫我們執行flush()方法。只是我們在進行大規模插入的時候,我們經常可以看到下面的操作:

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction();  
for ( int i=0; i<100000; i++ ) {  
Customer customer = new Customer(.....);  
session.save(customer);  
if ( i % 20 == 0 ) { 
//20, same as the JDBC batch size   
//flush a batch of inserts and release memory:   
session.flush();  
session.clear();  
}}  
tx.commit();session.close(); 

這樣做的目的就是避免大量插入,造成session里面內存溢出,所以我們定時清理一下就可以避免這個問題。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

修文县| 灵川县| 乐昌市| 曲阳县| 革吉县| 静乐县| 进贤县| 凤山县| 吉首市| 乐至县| 三穗县| 台北市| 迭部县| 灌阳县| 永泰县| 海淀区| 武安市| 永平县| 绵竹市| 东至县| 呼伦贝尔市| 常德市| 南开区| 炎陵县| 吉木萨尔县| 新田县| 商洛市| 来安县| 柳江县| 陇川县| 凉山| 徐州市| 子长县| 大兴区| 锡林郭勒盟| 顺平县| 溆浦县| 郎溪县| 宿松县| 永康市| 镶黄旗|