天天看點

Hibernate進階知識點必備

hibernate.show_sql:是否把Hibernate運作時的SQL語句輸出到控制台,編碼階段便于測試,為true的好

-hibernate.format_sql:輸出到控制台的SQL語句是否進行排版,便于閱讀。建議設定為true。它好我也好嘛。

hbm2ddl.auto:可以幫助由java代碼生成資料庫腳本,進而生成具具體的表結構。create | update | create_drop | validate

create: 每次都會建立一個新的表結構(慎用)

update: 更新變化的部分,會維持原有的測試資料的存在

create_drop: 如果有就删掉再重新生成(慎用)

validate: 驗證表結構有無沖突,有沖突則不進行操作

hibernate.default_schema: 預設的資料庫。在建立資料庫表結構的時候會加上此字首

hibernate.dialect:配置Hibernate資料庫的方言,Hibernate可以針對特殊的資料庫進行優化!

先看一下,hibernate的執行流程吧。

首先是Configuration(hibernate.cfg.xml)

然後是SessionFactory(Beans.hbm.xml):建立和銷毀都相當的耗費資源,通常一個系統内一個資料庫隻建立一個這樣的對象

Session: 相當于傳統的JDBC中的Connection(但是session與connection是多對一的關系。開發的時候盡量不要使用connection):

-開啟一個事務(Transaction)

利用session進行CRUD操作

事務送出(transaction。commit())

關閉會話(session.close())

關閉sessionFactory(如果需要的話,一般不需要)

如何擷取session對象:

openSession的方式:針對的是sessionFactory而言。

getCurrentSession的方式():需要在hibernate.cfg.xml中實作對name為hibernate.current_session_context_class的屬性的配置。值為thread代表本地事務。jta 代表全局事務。

這二者的差別:後者事務送出或者復原後悔自動的關閉,前者需要手動的關閉;後者使用的是單例模式,即隻是對同一個底層的session的操作,前者則是每次建立一個新的session進行操作。

Hibernate對資料庫的操作都是封裝在事務中的,并且預設是非自動送出的方式。是以,用Session儲存對象時,如果不開啟事務,并且手動的送出事務,對象并不會真正的儲存到資料庫中。

但是如果你想讓Hibernate像JDBC那樣自動的送出事務,必須調用session的對象的doWork()方法,獲得JDBC的connection後,設定其為自動送出事務模式。

通常來說,不建議采用自動送出的方式。因為要實作session的doWork方法,裡面是一個匿名的類,。