一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Hibernate三種狀態和Session常用的方法

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

2020-08-28 11:00尋找現實扭曲力場 Java教程

本文主要介紹了Hibernate三種狀態和Session常用的方法,具有很好的參考價值,下面跟著小編一起來看下吧

我們知道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所對應

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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注解,下面是相關的測試方法:

?
1
2
3
4
5
6
@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進行測試:

?
1
2
3
4
5
6
7
@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()方法。只是我們在進行大規模插入的時候,我們經常可以看到下面的操作:

?
1
2
3
4
5
6
7
8
9
10
11
12
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里面內存溢出,所以我們定時清理一下就可以避免這個問題。

 

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

原文鏈接:http://blog.csdn.net/pearyangyang/article/details/50359382

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产精品网 | 暖暖 免费 高清 日本 在线 | 亚洲视频在线一区二区三区 | 边摸边吃奶玩乳尖视频 | 日本一道本视频 | 国产90后美女露脸在线观看 | 色戒完整版2小时38分钟 | 日本人交换乱理伦片 | 四虎最新永久在线精品免费 | 停停色| 4p高h三男一女 | 成品人视频免费观看 | 九九99精品 | 丁香五香天堂网 | 506070老熟肥妇bbwxx视频 500第一精品 | 草草国产成人免费视频 | 国产日韩欧美在线一区二区三区 | 小寡妇好紧进去了好大看视频 | 欧美国产高清 | 国产成人无精品久久久 | 婷婷国产在线 | 精品在线播放视频 | 美女尿口羞羞视频 | 成人在线观看免费视频 | 青柠在线完整高清观看免费 | 99视频久久 | 国产成人亚洲精品91专区手机 | 久青草国产在线观看视频 | 免费标准高清看机机桶机机 | 欧美作爱福利免费观看视频 | 成年人免费观看 | 高清女主播一区二区三区 | 男男双性生子产乳高辣h | caoporm碰最新免费公开视频 | 免费日韩 | 亚洲无线一二三四区 | 欧美日韩国产成人精品 | 毛片区 | 国内老司机精品视频在线播出 | 美女的隐私无遮挡的网页 | 99年水嫩漂亮粉嫩在线播放 |