Hibernate原理及應用

来源:http://www.cnblogs.com/WangCY99/archive/2017/02/14/6396258.html
-Advertisement-
Play Games

Hibernate工作原理及為什麼要用? 原理:1.通過Configuration().configure();讀取並解析hibernate.cfg.xml配置文件2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>讀取並解析 ...


Hibernate工作原理及為什麼要用?

原理:
1.通過Configuration().configure();讀取並解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>讀取並解析映射信息
3.通過config.buildSessionFactory();//創建SessionFactory
4.sessionFactory.openSession();//打開Sesssion
5.session.beginTransaction();//創建事務Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事務
8.關閉Session
9.關閉SesstionFactory

為什麼要用:
1. 對JDBC訪問資料庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重覆性代碼。

2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

3. hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。

4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關係資料庫,從一對一到多對多的各種複雜關係。
 
2. Hibernate是如何延遲載入?
1. Hibernate2延遲載入實現:a)實體對象 b)集合(Collection)

2. Hibernate3 提供了屬性的延遲載入功能

當Hibernate在查詢數據的時候,數據並沒有存在與記憶體中,當程式真正對數據的操作時,對象才存在與記憶體中,就實現了延遲載入,他節省了伺服器的記憶體開銷,從而提高了伺服器的性能。

3.Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)

類與類之間的關係主要體現在表與表之間的關係進行操作,它們都市對對象進行操作,我們程式中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、

4. 說下Hibernate的緩存機制

1. 內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存

2. 二級緩存:
a) 應用及緩存
b) 分散式緩存
條件:數據不會被第三方修改、數據大小在可接受範圍、數據更新頻率低、同一數據被系統頻繁使用、非 關鍵數據
c) 第三方緩存的實現
一級緩存:session級的緩存也叫事務級的緩存,只緩存實體,生命周期和session一致。不能對其進行管理。

不用顯示的調用。

二級緩存:sessionFactory緩存,也叫進程級的緩存,使用第3方插件實現的,也值緩存實體,生命周期和sessionFactory一致,可以進行管理。

首先配置第3放插件,我們用的是EHCache,在hibernate.cfg.xml文件中加入

<property name="hibernate.cache.user_second_level_cache">true</property>

在映射中也要顯示的調用,<cache usage="read-only"/>

二級緩存之查詢緩存:對普通屬性進行緩存。如果關聯的表發生了修改,那麼查詢緩存的生命周期也結束了。

在程式中必須手動啟用查詢緩存:query.setCacheable(true);/////////

5. Hibernate的查詢方式
Sql、Criteria,object comptosition
Hql:
1、 屬性查詢
2、 參數查詢、命名參數查詢
3、 關聯查詢
4、 分頁查詢
5、 統計函數

6. 如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一取代
4.配置對象緩存,不使用集合緩存
5.一對多集合使用Bag,多對多集合使用Set
6. 繼承類使用顯式多態
7. 表欄位要少,表關聯不要怕多,有二級緩存撐腰


1.Hibernate有哪幾種查詢數據的方式

         (1)導航對象圖查詢

      (2)OID查詢

      (3)HQL

      (4)QBC

      (5)本地SQL

2.load()和get()的區別

 

load載入方法:

Java代碼

Users user = (Users)session.load(Users.class, userId);    

Users user = (Users)session.load(Users.class, userId);

get載入方法:

Java代碼

Users user = (Users)session.get(Users.class, userId);  

Users user = (Users)session.get(Users.class, userId);

 

兩載入方法區別:

區別1:如果資料庫中,沒有userId的對象。如果通過get方法載入,則返回的是一個null;如果通過load載入,則返回一個代理對象,如果後面代碼如果調用user對象的某個屬性(比如user.getPassword())會拋出異常:org.hibernate.ObjectNotFoundException;

區別2:load支持延遲載入,get不支持延遲載入。

工作原理圖

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • .NET是跨平臺的開發棧。它有一個標準庫,稱為.NET Standard Library,其中包含了大量的APIs。這個標準庫由各種.NET運行環境實現:.NET Framework、.NET Core和Xamarin-flavored Mono。 1:.NET Framework就是現有的開發人員 ...
  • 之前計劃每周發表一個博客,可是每當我準備發表的內容的時候,發現網上已經有很多這方面的介紹,而且自己的還不如別人寫的全面,所以就不獻醜了。本人不喜歡發表非原創文章,現在實在沒有什麼可寫的,於是就出現了本文的內容. 之前一直使用Windows7彩色文件夾 ,但是換成64位Win7立馬不能使用,Win10 ...
  • c#中的類是最常見的實際上就是對某種類型的對象定義變數和方法的原型。 結構是值類型,而類是引用類型。 1.與類不同,結構的實例化可以不使用 new 運算符。結構可以聲明構造函數,但它們必須帶參數。 2.一個結構不能從另一個結構或類繼承,而且不能作為一個類的基。所有結構都直接繼承自 System.Va ...
  • 假如需要實現一個代碼編輯器,其中一個很重要的功能是實現代碼提示,類似VS的代碼智能提示。下麵用Roslyn編譯器來實現一個簡單的代碼提示功能。 代碼提示,首先必須需要知道對象的類型信息,然後通過迭代獲取成員。 ...
  • 系統環境: vmware安裝的centos6.7虛擬機 jdk1.8版本 maven庫3.3.9版本(在使用源碼編譯啟動的時候需要修改配置文件與當前使用的maven版本匹配,最低使用版本好像是3.1.5,記不清了) 其他的一些ssh工具隨意。 1、二進位工程 ①NIFI下載地址:http://nif ...
  • 靜態成員:靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名+靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要實例化才會分配記憶體,所以靜態成員不能訪問非靜態的成員..因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中靜態的成員. 1、靜態全局變數 定義:在全局變 ...
  • (慕課網視頻學習--C++離港篇的學習memo)1: 函數的參數預設值,只能在最右邊。 如果有三個參數,只有中間一個有預設值,這是錯誤的。 函數聲明的時候寫預設值,定義的時候不要寫。(有些編譯器會出錯。)2:內聯函數:編譯時,將函數體實參和代碼替換掉調用語句。 關聯字 inline 內聯函數是建議性 ...
  • 1.普通成員普通成員都是屬於對象的用對象調用 2.靜態成員靜態成員是屬於類的用類名調用 stactic 靜態關鍵字 靜態方法裡面不能包含普通成員普通方法裡面可以包含靜態成員 抽象類: 1.關鍵字:abstract2.抽象類可以包含抽象方法和普通方法3.abstract關鍵字可以定義方法為抽象方法,抽 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...