Hibernate 什麼梗

一、基礎使用

Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關係,是一個全自動的 orm 框架,hibernate 可以自動生成SQL語句,自動執行。

1. 持久化類創建

設計原則:

  • 必需爲公有類 public,且含公有不帶參構造方法
  • 類內部屬性私有,提供 setter/getter 封裝

2. 創建對象關係映射文件-Clazz.hbm.xml

  • < hibernate-mapping >
屬性名稱 描述
schema 模式名稱
catalog 目錄名稱
default-cascade 級聯風格
default-access 訪問策略
default-lazy 加載策略
package 默認包名

  • < class >
屬性名稱 描述
name 映射類名
table 映射表名
batch-size 抓取策略
where 抓取條件
entity-name 多表映射

  • < id >
屬性名稱 描述
name 映射屬性名
type 映射屬性類型
column 映射表中對應的字段名稱
length 指定長度
< generator> 主鍵生成策略,如下常用
assigned:手工賦值
native:自動增長,覆蓋手工賦值

  • < component >
屬性名稱 描述
name 映射組件名
column 映射表中對應的字段名稱

  • < property >
屬性名稱 描述
name 映射屬性名
column 映射表中對應的字段名稱

3. 配置文件(常用配置)-hibernate.cfg.xml

屬性名字 描述 使用
show_sql 控制檯 log 輸出 true/false
format_sql 控制檯 log 排版 true/false
hbm2ddl.auto 數據處理與表結構生成 create: 每次刪除原有表,再創建新的表
update:在原有表上更新數據
create-drop:創建後刪除
validate:表結構驗證,一致的條件下創建
default_schema 默認數據庫,創建前綴表名稱 [schema_name]
dialect 數據庫方言
<session-factory>
    <!-- 數據庫用戶名 -->
    <property name="connection.username">root</property>
    <!-- 數據庫用戶名 -->
    <property name="connection.password">666666</property>
    <!-- 數據庫驅動類 -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <!-- 數據庫連接URL -->
    <property name="connection.url">jdbc:mysql://localhost:3306/db_examsystem</property>
    <!-- 數據庫方言 -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  

    <property name="show_sql">true</property>
    <property name="format_sql">true</property>   
    <property name="hbm2ddl.auto">create</property> 

    <!-- 關聯對象關係映射文件 --> 
    <mapping resource="Clazz.hbm.xml"/>  
</session-factory>

4. 事務處理

Hibernate 對數據的操作均封裝與事務當中按,且默認非自動提交(無啓動事務提交則無法將數據存儲值數據庫當中)

4.1 Session

  • 獲取方式(默認)-openSession
<!-- 需手動關閉,獲取新的 session 對象 -->
<property name="hibernate.current_session_context_class">jta</property>
  • 獲取方式-getCurrentSession()
<!-- 自動關閉,獲取原有 session 對象 -->
<property name="hibernate.current_session_context_class">thread</property>
  • 常用操作
    • save:存儲記錄
    • get:獲取記錄(調用時獲取,記錄不存在返回 null)
    • load:獲取記錄(使用時獲取,記錄不存在拋異常)
    • update:更新記錄
    • delete:刪除

4.2 Transaction

mSession.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
        connection.setAutoCommit(true);// 實現自動提交
    };
});

mSession.save(student);
mSession.flush();

或開啓事務實現數據提交存儲

mTransaction = mSession.beginTransaction();// 開啓
// ...
mTransaction.commit();// 提交

二、表映射

1. 一對多 one2many

  • 模擬當個課室中多個學生的場景,gId 爲關聯外鍵
<hibernate-mapping>
    <class name="[packname].Grade" table="grade">
         <id name="gId" type="int">
             <column name="gId" />
             <generator class="native" />
         </id>

        <set name="students" table="student" inverse="false" cascade="save-update" lazy="true">
           <key>
               <column name="gId" />
           </key>
           <one-to-many class="[packname].Student" />
        </set>
    </class>
</hibernate-mapping>
  • < set >常用屬性
屬性名稱 描述
name 映射類屬性的名稱
table 關聯類的目標數據庫表
lazy 指定關聯對象是否使用延遲加載
inverse 標識雙向關聯中被動的一方false/負責維護的一方true
cascade all:對所有炒作進行級聯炒作
save-update:執行保存和更新操作是進行級聯操作
delete:執行刪除操作時進行級聯操作
none:對所有操作不進行級聯操作

2. 多對一 many2one

  • 模擬多個學生在同一教室的場景,gId 爲關聯外鍵
<hibernate-mapping>
    <class name="[packname].Student" table="student">
         <id name="sId" type="int">
             <column name="sId" />
             <generator class="native" />
         </id>
    <many-to-one name="grade" class="[packname].Grade" column="gId" cascade="all"/>
</hibernate-mapping>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章