1. 程式人生 > >Hibernate 中的 openSession和getCurrentSession 方法的區別

Hibernate 中的 openSession和getCurrentSession 方法的區別

在比較openSession和getCurrentSession這兩個方法之前,我們先認識一下這兩個方法。

在進行配置資訊管理時,我們一般進行一下簡單步驟:

Configuration cfg = new Configuration(); // 獲得配置資訊物件
SessionFactory sf = cfg.configure().buildSessionFactory(); //解析並建立Session工廠


1. Session session = sf.getCurrentSession(); // 獲得Session

2. Session session = sf.openSession(); // 開啟Session

對於上述的兩個方法,有以下區別:

1. openSession 從字面上可以看得出來,是開啟一個新的session物件,而且每次使用都是開啟一個新的session,假如連續使用多次,則獲得的session不是同一個物件,並且使用完需要呼叫close方法關閉session。

2. getCurrentSession ,從字面上可以看得出來,是獲取當前上下文一個session物件,當第一次使用此方法時,會自動產生一個session物件,並且連續使用多次時,得到的session都是同一個物件,這就是與openSession的區別之一,簡單而言,getCurrentSession 就是:如果有已經使用的,用舊的,如果沒有,建新的。

注意:在實際開發中,往往使用getCurrentSession多,因為一般是處理同一個事務(即是使用一個資料庫的情況),所以在一般情況下比較少使用openSession或者說openSession是比較老舊的一套介面了;

對於getCurrentSession 來說,有以下一些特點:

1.用途,界定事務邊界

2.事務提交會自動close,不需要像openSession一樣自己呼叫close方法關閉session

3.上下文配置(即在hibernate.cfg.xml)中,需要配置:

<property name="current_session_context_class">thread</property>

(需要注意,這裡的current_session_context_class屬性有幾個屬性值:jta 、 thread 常用 , custom、managed 少用 )

a).thread使用connection 單資料庫連線管理事務

b).jta (Java transaction api) Java 分散式事務管理 (多資料庫訪問),jta 由中介軟體提供(JBoss WebLogic 等, 但是tomcat 不支援)

下面是openSession 和 getCurrentSession 簡單例項的區別 :

1.openSession方式 :

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.hibernate.model.Student; // 注意包路徑

public class StudentTest {
public static void main(String[] args) {

Student s = new Student();
s.setId(1);
s.setName("s1");
s.setAge(1);

Configuration cfg = new Configuration(); // 獲得配置資訊物件
SessionFactory sf = cfg.configure().buildSessionFactory(); //解析並建立Session工廠
Session session = sessionFactory.openSession(); // 開啟Session

session.beginTransaction(); // 看成一個事務,進行操作
session.save(s); // 會找到 Student 這個類,尋找set方法
session.getTransaction().commit(); // 提交對資料的操作
session.close();

sf.close();

}

}

2.getCurrentSession方式 :

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.hibernate.model.Student; // 注意包路徑

public class StudentTest {
public static void main(String[] args) {

Student s = new Student();
s.setId(1);
s.setName("s1");
s.setAge(1);

Configuration cfg = new Configuration(); // 獲得配置資訊物件
SessionFactory sf = cfg.configure().buildSessionFactory(); //解析並建立Session工廠
Session session = sessionFactory.getCurrentSession(); // 開啟Session

session.beginTransaction(); // 看成一個事務,進行操作
session.save(s); // 會找到 Student 這個類,尋找set方法
session.getTransaction().commit(); // 提交對資料的操作

sf.close();

}

}

Student 類程式碼 :

package com.hibernate.model;

public class Student {
private int id;
private String name;
private int age;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

相關推薦

Hibernate openSessiongetCurrentSession 方法區別

在比較openSession和getCurrentSession這兩個方法之前,我們先認識一下這兩個方法。 在進行配置資訊管理時,我們一般進行一下簡單步驟: Configuration cfg = new Configuration(); // 獲得配置資訊物件 S

Hibernategetload方法區別

load方法可返回沒有載入實體資料的代理類例項,而get方法永遠返回有實體資料的物件。(對於load和get方法返回型別:好多書中都說:“get方法永遠只返回實體類”,實際上並不正確,get方法如果在session快取中找到了該id對應的物件,如果剛好該物件前面是被代理過的,如被load方法使用過,或者被其他

Hibernateget()load()方法區別

在hibernate中我們知道如果要從資料庫中得到一個物件,通常有兩種方式,一種是通過session.get()方法,另一種就是通過session.load()方法,然後其實這兩種方法在獲得一個實體物件時是有區別的,在查詢效能上兩者是不同的。 一.load載入方式 當使用l

Hibernateget()load()的區別

factory all htm on() 被調用 容易 transacti rip con Hibernate中根據Id單條查詢獲取對象的方式有兩種,分別是get()和load(),來看一下這兩種方式的區別。 1. get() 使用get()來根據ID進行單條查詢:

Hibernategetload的區別

實體對象 alt 返回 images get .get 技術 log 查詢語句 在Hibernate中我們知道如果要從數據庫中得到一個對象,通常有兩種方式,一種是通過session.get()方法,另一種就是通過session.load()方法,然後其實這兩種方法在獲得

hibernateHibernateget()load()的區別

etime () bsp ava fin null void 自己 IT Hibernate中根據Id單條查詢獲取對象的方式有兩種,分別是get()和load(),來看一下這兩種方式的區別。 1. get() 使用get()來根據ID進行單條查詢: 1

hibernateevict()clear()的區別

指定 立即執行 例子 obj onf 線程 當前 錯誤 AS session.evict(obj):會把指定的緩沖對象進行清除; session.clear():把緩沖區內的全部對象清除,但不包括操作中的對象。 hibernate執行的順序如下: (1)生成一個事務的對象,

Hibernateloadget的區別

在Hibernate中,查詢一個物件的方法有兩種:load和get。兩者在延遲載入方面有所不同。 1、load查詢方式 通過load方法查詢物件的時候,Hibernate會使用延遲載入的方式來查詢指定的物件,也就是說,通過load方法獲取一個物件的時候,並沒有真的發出SQ

hibernateopenSession getCurrentSession 的實現

openSession  : public org.hibernate.classic.Session openSession() throws HibernateException {return openSession(interceptor);}public org.hibern

Hibernategetload方法

get方法和find方法都是直接從資料庫中檢索,而load方法的執行則比較複雜。首先查詢session的persistent Context中是否有快取,如果有則直接返回如果沒有則判斷是否是lazy,如果不是直接訪問資料庫檢索,查到記錄返回,查不到丟擲異常;如果是lazy則需要建立代理物件,物件的initia

hibernate 的 getload方法區別

1.get()採用立即載入方式,而load()採用延遲載入; get()方法執行的時候,會立即向資料庫發出查詢語句, 而load()方法返回的是一個代理(此代理中只有一個id屬性),只有等真正使用該物件屬性的時候,才會

openSession getCurrentSession區別

1 getCurrentSession建立的session會和繫結到當前執行緒,而openSession不會。 2 getCurrentSession建立的執行緒會在事務回滾或事物提交後自動關閉,而openSession必須手動關閉 這裡getCurrentSessio

jquerygetfind方法區別,物件與標籤元素的互換

今天用ajax做了一個上傳圖片實現預覽的效果,遇到了一個問題,在用jquery獲取img標籤的時候,我先是用的find()方法,這樣子上傳可以實現,但是效果的預覽就不能實現,我把獲取的標籤用console.log打印出來,原來是一個object物件,後來我又用g

hibernateexecuteFind()方法execute()方法區別

返回型別不同:executeFind()方法返回集合,execute()方法返回物件 轉載地址 executeFind方法 @Override public List<TCpContact> getCpContactByPage(final Map<

JS的call()apply()方法區別

prototype 理解 ace attach bdb .html closed mil solid 如 果沒接觸過動態語言,以編譯型語言的思維方式去理解javaScript將會有種神奇而怪異的感覺,因為意識上往往不可能的事偏偏就發生了,甚至覺得不可 理喻.如果在學Java

hibernate的get方法load方法區別

返回 exception 二級緩存 查詢 get方法 機制 als 分情況討論 如果 讀者需註意:Hibernate版本不同,運行機制不太一樣,以下是hibernate3.x作為講解 get方法:   Hibernate會確認一下該id對應的數據是否存在,首先在sessio

servlet表單getpost方法區別

pos span 轉化 不可見 上傳文件 post div font 支持 Form中的get和post方法,在數據傳輸過程中分別對應了HTTP協議中的GET和POST方法。二者主要區別如下:1、Get是用來從服務器上獲得數據,而Post是用來向服務器上傳遞數據。2、Get

Javawaitsleep方法區別

lee join 告訴 inter art 過程 lam 兩個 一次 1、兩者的區別 這兩個方法來自不同的類分別是Thread和Object 最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法(鎖代碼塊和方法鎖)。 w

java sendredirect()forward()方法區別

rect 次數 報錯 nec 重定向 web服務 單獨 exception aca 一.文章1 HttpServletResponse.sendRedirect與RequestDispatcher.forward方法都可以實現獲取相應URL資源。 sendRedirect

memcache的addset方法區別

相信大家對memcache都不陌生,在專案中也經常使用memcache作為快取方案,那麼在使用過程中有沒有發現為什麼memcahce有兩個新增緩 存的方法:一個是add,一個是set,那麼你知道這2個方法有什麼不同嗎?什麼時候該使用add?什麼時候該使用set呢? 對於這點以前自己也沒有去