Hibernate執(zhí)行流程
創(chuàng)建Configuration對(duì)象(作用:讀取配置文檔:Hibernate.cfg.xml, 目的是創(chuàng)建SessionFactory對(duì)象)
創(chuàng)建SessionFactory對(duì)象(會(huì)讀取相應(yīng)的對(duì)象映射文件XXXX.hbm.xml,創(chuàng)建和銷毀都相當(dāng)耗費(fèi)資源,通常一個(gè)系統(tǒng)內(nèi)一個(gè)數(shù)據(jù)庫只創(chuàng)建一個(gè))
創(chuàng)建Session對(duì)象(類似于JDBC的Connection)
獲取了Session對(duì)象就表示獲取了數(shù)據(jù)庫連接對(duì)象,那么就可以執(zhí)行Session對(duì)象里面的方法(save\delete\update\get)
需要注意的是:執(zhí)行某一個(gè)session
的方法時(shí),必須開啟一個(gè)事務(wù)Transaction
,也就是這些方法都需要封裝在事務(wù)中.執(zhí)行完session的方法后必須先提交事務(wù)再關(guān)閉session.
Hibernate常用配置
屬性 | 含義 |
---|---|
hibernate.show_sql | 是否把hibernate運(yùn)行時(shí)的SQL語句輸出到控制臺(tái),用于測(cè)試。 |
hibernate.format_sql | 是否對(duì)輸出到控制臺(tái)的SQL語句進(jìn)行排版,便于閱讀。 |
hbm2ddl.auto | 可以幫助由java代碼生成數(shù)據(jù)庫腳本,進(jìn)而生成具體的表結(jié)構(gòu)。 [ create /update /create-drop /validate ] |
hibernate.default_schema | 默認(rèn)的數(shù)據(jù)庫(類似于表名前面加前綴) |
hibernate.dialect | 配置hibernate數(shù)據(jù)庫方言,hibernate可針對(duì)特殊的數(shù)據(jù)庫進(jìn)行優(yōu)化 |
session簡(jiǎn)介
1.Hibernate是對(duì)JDBC的一個(gè)封裝,它不建議直接使用jdbc的connection操作數(shù)據(jù)庫,而是通過使用session 操作數(shù)據(jù)庫.那么我們可以簡(jiǎn)單理解session為操作數(shù)據(jù)庫的對(duì)象.<br>
2.session與connection是多對(duì)一關(guān)系,每個(gè)session都有一個(gè)與之對(duì)應(yīng)的connection,一個(gè)connection不同時(shí)刻可以供多個(gè)session使用.<br>
3.把對(duì)象保存在關(guān)系數(shù)據(jù)庫中需要調(diào)用session的各種方法進(jìn)行CURD等操作.<br>
transaction簡(jiǎn)介
hibernate對(duì)數(shù)據(jù)的操作都是封裝在事務(wù)當(dāng)中,并且默認(rèn)是非自動(dòng)提交的方式.所以用session保存對(duì)象時(shí),如果不開啟事務(wù),并且手工提交事務(wù),對(duì)象不會(huì)真正保存在數(shù)據(jù)庫中.
如果想讓Hibernate像jdbc那樣自動(dòng)提交事務(wù),必須調(diào)用session對(duì)象的dowork()方法,獲得jdbc的connection后,設(shè)置其為自動(dòng)提交事務(wù)模式.(<b>通常不推薦這樣做
</b>)
<code>
//示例代碼
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class StudentsTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init() {
//創(chuàng)建配置對(duì)象
Configuration config = new Configuration().configure();
//創(chuàng)建服務(wù)注冊(cè)對(duì)象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
applySettings(config.getProperties()).buildServiceRegistry();
//創(chuàng)建會(huì)話工廠對(duì)象
sessionFactory = config.buildSessionFactory(serviceRegistry);
//會(huì)話對(duì)象
session = sessionFactory.openSession();
//開啓事務(wù)
//transaction = session.beginTransaction();
}
@After
public void destory() {
//transaction.commit();//提交事務(wù)
session.close();//關(guān)閉會(huì)話
sessionFactory.close();//關(guān)閉會(huì)話工廠
}
@Test
public void testSaveStudents() {
//生成學(xué)生對(duì)象
Students s = new Students(1, "隔壁老王", "男", new Date(), "北京");
//自動(dòng)提交事務(wù)
session.doWork(new Work(){
@Override
public void execute(Connection conn) throws SQLException {
conn.setAutoCommit(true);
}
});
session.save(s);
session.flush();
}
}
</code>