# hibernate 2/18 觀念 ###### tags: `hibernate` struts 2(少用 已被取代) https://www.youtube.com/watch?v=BHo5rK3ULY0&list=PLmOn9nNkQxJF4Ekh8jLDRK6R6fGvLw5SC https://www.youtube.com/channel/UCYeDPubBiFCZXIOgGYoyADw ## 4 JDBC的利弊 ![](https://i.imgur.com/iGMLtuR.png) * **JDBC** * 標準(類別,介面) 存取資料庫 * 驅動程式要更新 ## 5 何謂ORM(Object Relational Mapping) ![](https://i.imgur.com/lzdlP3n.png) * **一對多** * 出版社<->書(可互相導入) * 延遲性的問題 oop存java物件語言 ORM 用操作固定的方式操作表格內的紀錄 ## 6 知名的JAVA OR Mapping技術 ![](https://i.imgur.com/tdUY8wR.png) Java Data Object(要錢) :+1:常用Hibernate,iBATIS(阿里巴巴) (重要)Java Persistence API(JPA) #### spring data 命名方法不用實作(DAO當作儲存資料庫) [spring-data-jpa](https://spring.io/projects/spring-data-jpa) spring-data-jpa不是java(jpa) ## 7 Hibernate ORM ![](https://i.imgur.com/OK53rXv.png) * **對應關係** * 類別對應表格 * 物件對應紀錄 * 屬性對應欄位 * 主鍵pk oid存主鍵值 ## 8 Hibernate ORM的優點 ![](https://i.imgur.com/UrAeaO8.png) 改用註釋(學習重點) * **註釋** * 會出現在類別檔裡面 * 註解寫給框架者看(方便別人幫忙) * 修改類別改註釋 Hibernate 不需要自己建立table 可自行建立 移除空欄位需自行移除 用物件導性基礎去設計 不需要照資料庫結構 ## 9 儲存一筆紀錄 Hibernate vs JDBC ![](https://i.imgur.com/TAtV4tC.png) ```javascript= Transaction tx = null;//交易 session.beginTransaction//執行交易 session.save(mem)//不管多少筆 ------- //如果有多個例外or異動 if(tx!=null)tx.rollback();//還原原來的樣子 ------- throw new RuntimeException(e.getMessage(),e);//再度丟出例外 ``` 企業邏輯 ## 10 查詢一筆紀錄 Hibernate vs JDBC ![](https://i.imgur.com/dGBLTbH.png) ## 11 刪除一筆紀錄 Hibernate vs JDBC ![](https://i.imgur.com/OJCNlvm.png) ## 12 修改一筆紀錄 Hibernate vs JDBC ![](https://i.imgur.com/gw8GwPh.png) ## 13 查詢多筆紀錄 Hibernate vs JDBC ![](https://i.imgur.com/TKlcEwq.png) ## 14 不適合使用Hibernate的時機 ![](https://i.imgur.com/hP0Z7r6.png) ## 15 Hibernate架構圖 ![](https://i.imgur.com/WHv8UlY.png) >永續物件[color=#907bf7] >>對應永續類別[color=red] >>組態檔hibernate.cfg.xml * **hibernate.cfg.xml** * 連線資訊 * 映射資訊 * 微調 進階資訊 ![](https://i.imgur.com/oz14rar.jpg) ![](https://i.imgur.com/Hp2vstz.png) ![](https://i.imgur.com/mcvnMEv.png) ![](https://i.imgur.com/NhPIyx5.png) ## 16 Hibernate組態檔 ![](https://i.imgur.com/N765QTX.png) ## 17 連線資訊 ![](https://i.imgur.com/Awak8bP.png) * **hibernate.dialect** * 方言(重要)要對應sql版本 每一個組態檔連一個資料庫 [mssql jdbc driver maven](https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc) pom.xml專案物件模型 [hibernate maven](https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc) xml ```click= //對應jar檔名稱 <artifactId>檔名 <version>版本 <artifactId>-<version>-<scope(.jar)> ``` 標籤裡面定義常數 ```click= 改版本只要改常數就好不需特別找 <version>${常數}</version> ``` ![](https://i.imgur.com/LVo6EXZ.png) ## 18 連線資訊 ![](https://i.imgur.com/vS2Ti6d.png) ## 19 映射資訊 ![](https://i.imgur.com/COVxKMC.png) ![](https://i.imgur.com/UIWnsQG.png) ## 20 進階資訊 ![](https://i.imgur.com/asn0Rjw.png) * **session工廠(需告訴組態檔位址)**. * create 先刪除 重新建立表格 表格內原有資料會遺失 * create-drop 很少用 關閉session就自動刪除 * update 新建sessionFactory物件(原來資料會保存)自動插入新欄位 * validate 檢查兩者相不相同 不相同會丟出例外 * 網路建議 <porprety name="hbm2ddl.auto">none</porprety> 不要給客戶動 ![](https://i.imgur.com/Tw8kRDF.png) Schema(結構) ## 21 進階資訊 ![](https://i.imgur.com/v7tm9nS.png) 以目前的環境只能填thread * **交易(重要)** 每個session底下都有一個conn物件 同一個連線需要同一個session物件連線 ![](https://i.imgur.com/q3i0GZz.png) 工廠.getCurrentSession 根目錄位置越高權位越高 ## 23 ![](https://i.imgur.com/KAuhbUd.png) ## 24 ![](https://i.imgur.com/yL2hunS.png) ## 25 ![](https://i.imgur.com/v9h2aIi.png) ## 26 ![](https://i.imgur.com/WjbFdzD.png) ![](https://i.imgur.com/WW89GTB.png) 可以指定表格名稱 沒有寫@table就是類別的名稱 這兩個組合欄位不可重複 ![](https://i.imgur.com/6lMTimp.png) ## 28 註釋說明三 ![](https://i.imgur.com/f9Tki0A.png) Transient(重要) ![](https://i.imgur.com/h7bsGmc.png) ## 32 編寫Hibernate程式的通則 ![](https://i.imgur.com/MmwlK8I.png) 讀取用createQuery ## 33 建立SessionFactory物件 ![](https://i.imgur.com/O0Wdp0t.png) ## 34 SessionFactory介面 ![](https://i.imgur.com/7c4x39H.png) 實作session工廠類別 ## 35 建立SessionFactory的時機 ![](https://i.imgur.com/84nunED.png) 建立工廠 ## 36 Session介面 ![](https://i.imgur.com/ko8LPrU.png) 區域變數 不會給多個執行緒 * **Session型態** * 定義在方法裡面的變數 ## 37 Session物件的關閉 ![](https://i.imgur.com/i9Zag2Z.png) ## 38 openSession() ![](https://i.imgur.com/kvskMxu.png) ## 39 getCurrentSession() ![](https://i.imgur.com/WV3OrZw.png) ## 40 openSession() vs getCurrentSession() ![](https://i.imgur.com/GWXXi5c.png) ## 41 Transaction介面 ![](https://i.imgur.com/t8Zls6m.png)