Hibernate三種狀態(tài)和Session常用的方法
我們知道hibernate的核心就是對數(shù)據(jù)庫的操作,里面的核心接口就是org.hibernate.Session接口。要想對數(shù)據(jù)庫操作我們就要理清楚對象在整個操作中的所屬的狀態(tài)(Transient,Persistent,Detached)。就像馬士兵老師在視頻中所說的,我們并不必死摳這些字眼,我們通過自己編寫測試類就可以他們之間不同的區(qū)別。
其實(shí)三種狀態(tài)各自的不必總結(jié)那么多,只是一個重要的地方就是Transient狀態(tài)里面的對象是沒有id的。
session中常用的方法是save(),update(),saveOrUpdate(),get(),load(),delete(),clear(),flush()這些
其中大學(xué)期間我其實(shí)對get和load方法都不是太熟悉,死記硬背才在考試中答題,現(xiàn)在想起完全沒有這個必要。我們可以根據(jù)配置好的hibernate環(huán)境來進(jìn)行junit測試。
首先我們進(jìn)行g(shù)et()方法進(jìn)行測試。
這里我們首先建立一個實(shí)體類,StudentEntity.Java 和數(shù)據(jù)庫中student所對應(yīng)
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編譯環(huán)境給我們配置好了,這里我們要注意,要使用getCurrentSession()來操作的話,我們首先要在Junit類中加上@Transaction注解,下面是相關(guān)的測試方法:
@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方法,我們發(fā)現(xiàn)一旦我們只是拿student這個實(shí)體操作,get方法是會輸出相關(guān)的sql查詢語句的,而我們注釋掉get方法,換load方法的話,load方法執(zhí)行拿student這個實(shí)體的數(shù)據(jù)是沒有輸出相應(yīng)的sql語句的。但是我們在對student類進(jìn)行操作的時候,這時才輸出相關(guān)的語句.
所以我們看出get()和load()之間的差別:
get()每次執(zhí)行都會執(zhí)行sql語句,不會延遲。load()方法只是會在我們對拿到的實(shí)體進(jìn)行操作的時候才去執(zhí)行查詢,拿到相應(yīng)的實(shí)體信息。load方法返回的是一個代理對象(馬士兵老師視頻)。無論是get還是load首先都會查一級緩存(session)中有沒有相應(yīng)的對應(yīng)值,如果沒有,再去數(shù)據(jù)庫進(jìn)行查找。
clear()方法是對session里面的緩存進(jìn)行了清理,測試這個方法我們可以根據(jù)下面的Junit進(jìn)行測試:
@Test public void testClear() { Session session = sessionFactory.getCurrentSession(); session.get(StudentEntity.class,1); session.clear(); session.get(StudentEntity.class,1); }
如果我們把session.clear()注釋掉的話,我們就可以看到只執(zhí)行了一條sql語句
flush()方法是是對數(shù)據(jù)庫同步的一條語句,執(zhí)行完這個后立即刷新到數(shù)據(jù)庫。粗淺的來看哈,其實(shí)里面還是有很多東西,比如FlushMode這個類,我們默認(rèn)設(shè)置的是FlushMode.AUTO,這個一般不修改,只是為了以后的性能調(diào)優(yōu)。其實(shí)我們在執(zhí)行事務(wù)的時候,事務(wù)完成之后它會幫我們執(zhí)行flush()方法。只是我們在進(jìn)行大規(guī)模插入的時候,我們經(jīng)??梢钥吹较旅娴牟僮鳎?/p>
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里面內(nèi)存溢出,所以我們定時清理一下就可以避免這個問題。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
BigDecimal的toString()、toPlainString()和toEngineeringString()區(qū)
使用BigDecimal進(jìn)行打印的時候,經(jīng)常會對BigDecimal提供的三個toString方法感到好奇,以下整理3個toString方法的區(qū)別及用法,需要的朋友可以參考下2023-08-08Spring中@DependsOn注解的作用及實(shí)現(xiàn)原理解析
這篇文章主要介紹了Spring中@DependsOn注解的作用及實(shí)現(xiàn)原理解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03idea gradle項(xiàng)目復(fù)制依賴小技巧(推薦)
這篇文章主要介紹了idea gradle項(xiàng)目復(fù)制依賴小技巧,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11線程池FutureTask異步執(zhí)行多任務(wù)實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了線程池FutureTask異步執(zhí)行多任務(wù)實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11spring boot 添加admin監(jiān)控的方法
這篇文章主要介紹了spring boot 添加admin監(jiān)控的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-02-02Spring MVC 基于URL的映射規(guī)則(注解版)
這篇文章主要介紹了Spring MVC 基于URL的映射規(guī)則(注解版) ,詳細(xì)的介紹了幾種方式,有興趣的可以了解一下2017-05-05多線程計(jì)數(shù),怎么保持計(jì)數(shù)準(zhǔn)確的方法
這篇文章主要介紹了多線程計(jì)數(shù)的方法,有需要的朋友可以參考一下2014-01-01