1. 程式人生 > 實用技巧 >JavaEE學習之Hibernate框架

JavaEE學習之Hibernate框架

Hibernate 學習

一、hibernate 簡介

二、hibernate 架構

三、hibernate ORM

四、hibernate 配置

五、hibernate 註釋

六、hibernate 物件

七、hibernate 基本的增刪改查

八、hibernate HQL語句

九、hibernate Criteria

十、hibernate 原生sql

十一、hibernate 表關係的處理

一、hibernate 簡介

  1. Hibernate 是由 Gavin King 於 2001 年建立的開放原始碼的物件關係框架。它強大且高效的構建具有關係物件永續性和查詢服務的 Java 應用程式。

  2. Hibernate 將 Java 類對映到資料庫表中,從 Java 資料型別中對映到 SQL 資料型別中,並把開發人員從 95% 的公共資料持續性程式設計工作中解放出來。

  3. 支援的資料庫:Hibernate 支援幾乎所有的主要 RDBMS。

二、hibernate 架構

  1. Hibernate 是傳統 Java 物件和資料庫伺服器之間的橋樑,用來處理基於 O/R 對映機制和模式的那些物件。

  2. Hibernate 架構是分層的,作為資料訪問層,你不必知道底層 API 。Hibernate 利用資料庫以及配置資料來為應用程式提供持續性服務(以及持續性物件)。

  3. Hibernate 在三層架構中的地位

三、hibernate ORM

ORM 表示 Object-Relational Mapping (ORM),是一個方便在關係資料庫和類似於 Java, C# 等面向物件的程式語言中轉換資料的技術。ORM 系統相比於普通的 JDBC 有以下的優點:

  1. 使用業務程式碼訪問物件而不是資料庫中的表

  2. 從面向物件邏輯中隱藏 SQL 查詢的細節

  3. 基於 JDBC 的 'under the hood'

  4. 沒有必要去處理資料庫實現

  5. 實體是基於業務的概念而不是資料庫的結構

  6. 事務管理和鍵的自動生成

  7. 應用程式的快速開發

四、hibernate 配置(以MySQL為例)

  1. 環境搭建(可以到 http://www.hibernate.org/downloads 下載hibernate相關jar包),除了hibernate需要的jar包外,還要匯入資料庫驅動。

  2. Hibernate框架核心配置檔案

    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
    <!--四個必填項-->
    <!--配置資料來源-->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedemo?characterEncoding=utf8</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">123456</property>

    <!--可選項-->
    <!--是否輸出hibernate相關資訊到控制檯-->
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>

    <!--配置方言-->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

    <!--配置建表策略-->
    <property name="hibernate.hbm2ddl.auto">update</property>

    <!--關聯一下 ORM 檔案-->
    <mapping resource="cn/edu/dgut/bean/User.hbm.xml"></mapping>
    </session-factory>
    </hibernate-configuration>

  1. Hibernate 持久化類

    public class User {
    private int id;
    private String username;
    private String password;
    private String address;

    public int getId() {
    return id;
    }

    public void setId(int id) {
    this.id = id;
    }

    public String getUsername() {
    return username;
    }

    public void setUsername(String username) {
    this.username = username;
    }

    public String getPassword() {
    return password;
    }

    public void setPassword(String password) {
    this.password = password;
    }

    public String getAddress() {
    return address;
    }

    public void setAddress(String address) {
    this.address = address;
    }

    @Override
    public String toString() {
    return "User{" +
    "id=" + id +
    ", username='" + username + '\'' +
    ", password='" + password + '\'' +
    ", address='" + address + '\'' +
    '}';
    }
    }

  2. Hibernate 對映檔案

    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    <!--ORM 對映 實體類和 資料表對映-->
    <class name="cn.edu.dgut.bean.User" table="tb_user">
    <id name="id" column="id">
    <!--設定主鍵策略-->
    <generator class="native"></generator>
    </id>
    <property name="username" column="username"></property>
    <property name="password" column="password"></property>
    <property name="address" column="address"></property>
    </class>

    </hibernate-mapping>

五、hibernate 註釋

Hibernate 註釋是無需使用 XML 檔案來定義對映的最新方法。你可以額外使用註釋或直接代替 XML 對映元資料。

Hibernate 註釋是一種強大的來給物件和關係對映表提供元資料的方法。所有的元資料被新增到 POJO java 檔案程式碼中,這有利於使用者在開發時更好的理解表的結構和 POJO。

  1. 添加註釋相關jar包

    hibernate-annotations.jar, hibernate-comons-annotations.jar和 ejb3-persistence.jar

  2. 用帶有註釋的 Employee 類來對映使用定義好的 Employee 表的物件

    import javax.persistence.*;

    @Entity
    @Table(name = "EMPLOYEE")
    public class Employee {
    @Id @GeneratedValue
    @Column(name = "id")
    private int id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "salary")
    private int salary;

    public Employee() {}
    public int getId() {
    return id;
    }
    public void setId( int id ) {
    this.id = id;
    }
    public String getFirstName() {
    return firstName;
    }
    public void setFirstName( String first_name ) {
    this.firstName = first_name;
    }
    public String getLastName() {
    return lastName;
    }
    public void setLastName( String last_name ) {
    this.lastName = last_name;
    }
    public int getSalary() {
    return salary;
    }
    public void setSalary( int salary ) {
    this.salary = salary;
    }
    }

    Hibernate 檢測到 @Id 註釋欄位並且認定它應該在執行時通過欄位直接訪問一個物件上的屬性。如果你將 @Id 註釋放在 getId() 方法中,你可以通過預設的 getter 和 setter 方法來訪問屬性。因此,所有其它註釋也放在欄位或是 getter 方法中,決定於選擇的策略。下一節將解釋上面的類中使用的註釋。

  3. 註釋

    @Entity 註釋

    • EJB 3 標準的註釋包含在 javax.persistence 包,所以我們第一步需要匯入這個包。第二步我們對 Employee 類使用 @Entity 註釋,標誌著這個類為一個實體 bean,所以它必須含有一個沒有引數的建構函式並且在可保護範圍是可見的。

    @Table 註釋

    • @table 註釋允許您明確表的詳細資訊保證實體在資料庫中持續存在。

    • @table 註釋提供了四個屬性,允許您覆蓋的表的名稱,目錄及其模式,在表中可以對列制定獨特的約束。現在我們使用的是表名為 EMPLOYEE。

    @Id 和 @GeneratedValue 註釋

    • 每一個實體 bean 都有一個主鍵,你在類中可以用 @Id 來進行註釋。主鍵可以是一個欄位或者是多個欄位的組合,這取決於你的表的結構。

    • 預設情況下,@Id 註釋將自動確定最合適的主鍵生成策略,但是你可以通過使用 @GeneratedValue 註釋來覆蓋掉它。strategygenerator 這兩個引數我不打算在這裡討論,所以我們只使用預設鍵生成策略。讓 Hibernate 確定使用哪些生成器型別來使程式碼移植於不同的資料庫之間。

    @Column Annotation

    @Column 註釋用於指定某一列與某一個欄位或是屬性對映的細節資訊。您可以使用下列註釋的最常用的屬性:

    • name 屬性允許顯式地指定列的名稱。

    • length 屬性為用於對映一個值,特別為一個字串值的列的大小。

    • nullable 屬性允許當生成模式時,一個列可以被標記為非空。

    • unique 屬性允許列中只能含有唯一的內容

  4. hibernate.cfg.xml 配置檔案

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-configuration SYSTEM
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

    <hibernate-configuration>
    <session-factory>
    <!--四個必填項-->
    <!--配置資料來源-->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedemo?characterEncoding=utf8</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">123456</property>

    <!--可選項-->
    <!--是否輸出hibernate相關資訊到控制檯-->
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>

    <!--配置方言-->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

    <!--配置建表策略-->
    <property name="hibernate.hbm2ddl.auto">update</property>

    <!--關聯一下 ORM 檔案-->
    <mapping resource="cn/edu/dgut/bean/User.hbm.xml"></mapping>
    </session-factory>
    </hibernate-configuration>

六、hibernate 主要物件

  1. SessionFactory 物件

  • 配置物件被用於創造一個 SessionFactory 物件,使用提供的配置檔案為應用程式依次配置 Hibernate,並允許例項化一個會話物件。SessionFactory 是一個執行緒安全物件並由應用程式所有的執行緒所使用。

  • SessionFactory 是一個重量級物件所以通常它都是在應用程式啟動時創造然後留存為以後使用。每個資料庫需要一個 SessionFactory 物件使用一個單獨的配置檔案。所以如果你使用多種資料庫那麼你要創造多種 SessionFactory 物件。

  1. Session 物件

  • 一個會話被用於與資料庫的物理連線。Session 物件是輕量級的,並被設計為每次例項化都需要與資料庫的互動。持久物件通過 Session 物件儲存和檢索。

  • Session 物件不應該長時間保持開啟狀態因為它們通常情況下並非執行緒安全,並且它們應該按照所需創造和銷燬。

  1. Transaction 物件

  • 一個事務代表了與資料庫工作的一個單元並且大部分 RDBMS 支援事務功能。在 Hibernate 中事務由底層事務管理器和事務(來自 JDBC 或者 JTA)處理。

  • 這是一個選擇性物件,Hibernate 應用程式可能不選擇使用這個介面,而是在自己應用程式程式碼中管理事務。

  1. Query 物件

  • Query 物件使用 SQL 或者 Hibernate 查詢語言(HQL)字串在資料庫中來檢索資料並創造物件。一個查詢的例項被用於連結查詢引數,限制由查詢返回的結果數量,並最終執行查詢。

  1. Criteria 物件

  • Criteria 物件被用於創造和執行面向規則查詢的物件來檢索物件。

七、hibernate 基本的增刪改查

  1. 建立sql會話物件的過程封裝成工具類

    public class HibernateUtil {

    private static SessionFactory sessionFactory = null;
    static {
    // 建立配置物件,讀取hibernate.cfg.xml配置檔案
    Configuration configuration = new Configuration().configure();
    // 建立一個會話工廠
    sessionFactory = configuration.buildSessionFactory();
    }

    // 返回一個會話物件
    public static Session getSession() {
    // 開啟會話,類似於jdbc中的connection
    return sessionFactory.openSession();
    }
    }

    1. 基本的增刪改查

    public class HbmDemo01 {
    /*// 建立配置物件
    Configuration configuration = new Configuration().configure();
    // 建立一個會話工廠
    SessionFactory sessionFactory = configuration.buildSessionFactory();
    // 開啟會話
    Session session = sessionFactory.openSession();*/

    //增
    @Test
    public void save() {
    // 呼叫工具類,得到一個會話物件
    Session session = HibernateUtil.getSession();
    // 開啟事務
    Transaction transaction = session.beginTransaction();

    // 建立一個使用者物件,並設定屬性初始值
    User user = new User();
    user.setUsername("瑞茲");
    user.setPassword("666666");
    user.setAddress("符文之地");

    // 操作資料庫,進行插入資料
    session.save(user);

    // 提交事務
    transaction.commit();
    //transaction.rollback();

    }

    //刪
    @Test
    public void delete() {
    Session session = HibernateUtil.getSession();
    // 開啟事務
    Transaction transaction = session.beginTransaction();

    // 從資料庫查詢出對應id資料
    User user = session.get(User.class, 1);

    // 操作資料庫,進行刪除資料
    session.delete(user);

    // 提交事務
    transaction.commit();
    }

    //改
    @Test
    public void update() {
    Session session = HibernateUtil.getSession();
    // 開啟事務
    Transaction transaction = session.beginTransaction();

    // 從資料庫查詢出對應id資料
    User user = session.get(User.class, 2);
    user.setUsername("亞索");
    user.setAddress("艾歐尼亞");

    // 操作資料庫,進行刪除資料
    session.update(user);

    // 提交事務
    transaction.commit();
    }

    //查
    @Test
    public void query() {
    Session session = HibernateUtil.getSession();
    // 開啟事務
    Transaction transaction = session.beginTransaction();

    // 從資料庫查詢出對應id資料
    User user = session.get(User.class, 2);

    // 輸出查詢到的資料
    System.out.println(user);

    // 提交事務
    transaction.commit();
    }
    }

八、hibernate HQL語句

Hibernate 查詢語言(HQL)是一種面向物件的查詢語言,類似於 SQL,但不是去對錶和列進行操作,而是面向物件和它們的屬性。 HQL 查詢被 Hibernate 翻譯為傳統的 SQL 查詢從而對資料庫進行操作。

public class HbmDemo02 {
@Test
public void query1() {
Session session = HibernateUtil.getSession();
String hql = " from cn.edu.dgut.bean.User ";

// 建立HQL物件
Query query = session.createQuery(hql);

// 從資料庫查詢出對應資料
List<User> users = query.list();

// 輸出查詢到的資料
for (User user : users) {
System.out.println(user);
}
}

@Test
public void query2() {
Session session = HibernateUtil.getSession();
String hql = " from cn.edu.dgut.bean.User where id=2";

// 建立HQL物件
Query query = session.createQuery(hql);

// 從資料庫查詢出對應資料
User user = (User) query.uniqueResult();

// 輸出查詢到的資料
System.out.println(user);
}

@Test
public void query3() {
Session session = HibernateUtil.getSession();
// JDBC 中預編譯模板技術 PrepareStatment Statment
// String hql = " from cn.edu.dgut.bean.User where id=? ";
String hql = " from cn.edu.dgut.bean.User where id=:id ";

// 建立HQL物件
Query query = session.createQuery(hql);
// 設定預編譯模板佔位符的值
// query.setInteger(0, 3);
// query.setInteger("id", 3);

// query.setParameter(0,5);
query.setParameter("id", 5);

// 從資料庫查詢出對應資料
User user = (User) query.uniqueResult();

// 輸出查詢到的資料
System.out.println(user);
}

@Test
public void query4() {
Session session = HibernateUtil.getSession();
String hql = " from User ";

// 建立HQL物件
Query query = session.createQuery(hql);
// 分頁查詢引數設定
query.setFirstResult(0);
query.setMaxResults(3);

// 從資料庫查詢出對應資料
List<User> users = query.list();

// 輸出查詢到的資料
for (User user : users) {
System.out.println(user);
}
}
}

九、hibernate Criteria

Hibernate 提供了操縱物件和相應的 RDBMS 表中可用的資料的替代方法。一種方法是標準的 API,它允許你建立一個標準的可程式設計查詢物件來應用過濾規則和邏輯條件。

Hibernate Session 介面提供了 createCriteria() 方法,可用於建立一個 Criteria 物件,使當您的應用程式執行一個標準查詢時返回一個持久化物件的類的例項。

public class HbmDemo03 {
// Criteria無語句 面向物件來查詢

@Test
public void query1() {
Session session = HibernateUtil.getSession();

Criteria criteria = session.createCriteria(User.class);

// 從資料庫查詢出對應資料
List<User> users = criteria.list();

// 輸出查詢到的資料
for (User user : users) {
System.out.println(user);
}
}

@Test
public void query2() {
Session session = HibernateUtil.getSession();

Criteria criteria = session.createCriteria(User.class);

// 從資料庫查詢出對應資料
criteria.add(Restrictions.eq("username", "亞索"));

// 條件查詢,查詢id為1的使用者資料
User user = (User) criteria.uniqueResult();

// 輸出查詢到的資料
System.out.println(user);
}

@Test
public void query3() {
Session session = HibernateUtil.getSession();

// 根據使用者名稱模糊查詢
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.like("username", "%艾%"));

// 模糊查詢
List<User> users = criteria.list();
// 輸出查詢到的資料
for (User user : users) {
System.out.println(user);
}

}

@Test
public void query4() {
Session session = HibernateUtil.getSession();

// 分頁查詢
Criteria criteria = session.createCriteria(User.class);
criteria.setFirstResult(0);
criteria.setMaxResults(4);

// 分頁查詢
List<User> users = criteria.list();

// 輸出查詢到的資料
for (User user : users) {
System.out.println(user);
}
}

@Test
public void query5() {
Session session = HibernateUtil.getSession();

Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.count("id"));

// 聚合函式(總行數)查詢
Long count = (Long) criteria.uniqueResult();

System.out.println("總使用者數為:" + count);
}
}

十、hibernate 原生sql

如果你想使用資料庫特定的功能如查詢提示或 Oracle 中的 CONNECT 關鍵字的話,你可以使用原生 SQL 資料庫來表達查詢。Hibernate 3.x 允許您為所有的建立,更新,刪除,和載入操作指定手寫 SQL ,包括儲存過程。

public class HbmDemo04 {
// 原生sql查詢

@Test
public void query1() {
Session session = HibernateUtil.getSession();

// 編寫sql語句
String sql = "select * from tb_user ";
// 建立sql查詢物件
SQLQuery sqlQuery = session.createSQLQuery(sql);
// 指定將結果集封裝到哪個物件
sqlQuery.addEntity(User.class);

// 從資料庫查詢出對應資料
List<User> users = sqlQuery.list();

// 輸出查詢到的資料
for (User user : users) {
System.out.println(user);
}
}

@Test
public void query2() {
Session session = HibernateUtil.getSession();

String sql = "select * from tb_user where address=?";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.setParameter(0, "艾歐尼亞");

// 指定將結果集封裝到哪個物件
sqlQuery.addEntity(User.class);

// 條件查詢,查詢id為1的使用者資料
User user = (User) sqlQuery.uniqueResult();

// 輸出查詢到的資料
System.out.println(user);
}

@Test
public void query3() {
Session session = HibernateUtil.getSession();

String sql = "select * from tb_user where username like ? ";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.setParameter(0, "%亞%");

sqlQuery.addEntity(User.class);

// 模糊查詢
List<User> users = sqlQuery.list();
// 輸出查詢到的資料
for (User user : users) {
System.out.println(user);
}

}

@Test
public void query4() {
Session session = HibernateUtil.getSession();

String sql = "select * from tb_user ";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.setFirstResult(0);
sqlQuery.setMaxResults(5);

sqlQuery.addEntity(User.class);

// 分頁查詢
List<User> users = sqlQuery.list();

// 輸出查詢到的資料
for (User user : users) {
System.out.println(user);
}
}

}

十一、hibernate 表關係的處理

  1. 一對多表關係

    • 實體類

      public class User {
      private int id; // 使用者id
      private String username; //使用者名稱
      private String password; //密碼
      private String address; //住址
      List<Skin> skins = new ArrayList<>(); //面板

      public int getId() {
      return id;
      }

      public void setId(int id) {
      this.id = id;
      }

      public String getUsername() {
      return username;
      }

      public void setUsername(String username) {
      this.username = username;
      }

      public String getPassword() {
      return password;
      }

      public void setPassword(String password) {
      this.password = password;
      }

      public String getAddress() {
      return address;
      }

      public void setAddress(String address) {
      this.address = address;
      }

      public List<Skin> getSkins() {
      return skins;
      }

      public void setSkins(List<Skin> skins) {
      this.skins = skins;
      }

      @Override
      public String toString() {
      return "User{" +
      "id=" + id +
      ", username='" + username + '\'' +
      ", password='" + password + '\'' +
      ", address='" + address + '\'' +
      ", skins=" + skins +
      '}';
      }
      }
      public class Skin {
      private int id; // 面板id
      private String skinName; // 面板名字
      private boolean colors; // 是否有炫彩面板
      private User user; // 對應英雄

      public Skin() {
      }

      public Skin(String skinName, boolean colors) {
      }

      public int getId() {
      return id;
      }

      public void setId(int id) {
      this.id = id;
      }

      public String getSkinName() {
      return skinName;
      }

      public void setSkinName(String skinName) {
      this.skinName = skinName;
      }

      public boolean isColors() {
      return colors;
      }

      public void setColors(boolean colors) {
      this.colors = colors;
      }

      public User getUser() {
      return user;
      }

      public void setUser(User user) {
      this.user = user;
      }

      }
    • ORM 對映(實體類和資料表對映)

      <!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
      <hibernate-mapping package="cn.edu.dgut.bean">
      <!--ORM 對映 實體類和 資料表對映-->
      <class name="User" table="tb_user">
      <id name="id" column="id">
      <!--設定主鍵策略-->
      <generator class="native"></generator>
      </id>
      <property name="username" column="username"></property>
      <property name="password" column="password"></property>
      <property name="address" column="address"></property>

      <!--配置一對多關係-->
      <list name="skins" cascade="all">
      <key column="uid"></key>
      <index column="[index]"></index>
      <one-to-many class="Skin"></one-to-many>
      </list>
      </class>
      </hibernate-mapping>
      <!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
      <hibernate-mapping package="cn.edu.dgut.bean">
      <!--ORM 對映 實體類和 資料表對映-->
      <class name="Skin" table="tb_skin">
      <id name="id" column="id">
      <!--設定主鍵策略-->
      <generator class="native"></generator>
      </id>
      <property name="skinName" column="skin_name"></property>
      <property name="colors" column="colors"></property>

      <!--配置多對一關係-->
      <many-to-one name="user" column="uid" class="User"></many-to-one>
      </class>

      </hibernate-mapping>
    • HibernateUtil和hibernate.cfg.xml(關聯ORM對映檔案即可)基本不變

    • 測試類

      public class HbmDemo01 {
      @Test
      public void save() {
      // 呼叫工具類,得到一個會話物件
      Session session = HibernateUtil.getSession();
      // 開啟事務
      Transaction transaction = session.beginTransaction();

      // 建立一個使用者物件,並設定屬性初始值
      User user = new User();
      user.setUsername("亞索");
      user.setPassword("666666");
      user.setAddress("艾歐尼亞");

      Skin skin1 = new Skin();
      skin1.setSkinName("原計劃");
      skin1.setColors(false);
      Skin skin2 = new Skin();
      skin2.setSkinName("黑夜使者");
      skin2.setColors(false);
      Skin skin3 = new Skin();
      skin3.setSkinName("奧德賽");
      skin3.setColors(true);

      user.getSkins().add(skin1);
      user.getSkins().add(skin2);
      user.getSkins().add(skin3);

      skin1.setUser(user);
      skin2.setUser(user);
      skin3.setUser(user);

      // 操作資料庫,進行插入資料
      session.save(user);
      // session.save(skin1);
      // session.save(skin2);
      // session.save(skin3);

      // 提交事務
      transaction.commit();

      }
      }

  2. 多對多表關係

    • 實體類

      public class Hero {
      private int heroid; // 英雄id
      private String heroname; //英雄名
      private String password; //密碼
      private String address; //住址
      Set<Route> routes = new HashSet<>(); //路線

      public int getHeroid() {
      return heroid;
      }

      public void setHeroid(int heroid) {
      this.heroid = heroid;
      }

      public String getHeroname() {
      return heroname;
      }

      public void setHeroname(String heroname) {
      this.heroname = heroname;
      }

      public String getPassword() {
      return password;
      }

      public void setPassword(String password) {
      this.password = password;
      }

      public String getAddress() {
      return address;
      }

      public void setAddress(String address) {
      this.address = address;
      }

      public Set<Route> getRoutes() {
      return routes;
      }

      public void setRoutes(Set<Route> routes) {
      this.routes = routes;
      }

      @Override
      public String toString() {
      return "Hero{" +
      "heroid=" + heroid +
      ", heroname='" + heroname + '\'' +
      ", password='" + password + '\'' +
      ", address='" + address + '\'' +
      ", routes=" + routes +
      '}';
      }
      }
      public class Route {
      private int routeid; // 路線id
      private String routename; // 路線名字
      Set<Hero> heroes = new HashSet<>(); // 對應英雄

      public int getRouteid() {
      return routeid;
      }

      public void setRouteid(int routeid) {
      this.routeid = routeid;
      }

      public String getRoutename() {
      return routename;
      }

      public void setRoutename(String routename) {
      this.routename = routename;
      }

      public Set<Hero> getHeroes() {
      return heroes;
      }

      public void setHeroes(Set<Hero> heroes) {
      this.heroes = heroes;
      }

      @Override
      public String toString() {
      return "Route{" +
      "routename='" + routename + '\'' +
      '}';
      }
      }
    • ORM 對映(實體類和資料表對映)

      <!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
      <hibernate-mapping package="cn.edu.dgut.bean">
      <!--ORM 對映 實體類和 資料表對映-->
      <class name="Hero" table="tb_hero">
      <id name="heroid" column="heroid">
      <!--設定主鍵策略-->
      <generator class="native"></generator>
      </id>
      <property name="heroname" column="heroname"></property>
      <property name="password" column="password"></property>
      <property name="address" column="address"></property>
      <!--
      set 表示配置set 集合

      name 填寫引用對方的 實體屬性名稱

      tbale 填寫 中間表的表名


      key colunm 屬性 填寫 當前 實體 在第三方表中 外來鍵 名稱

      many-to-many 表示 多對多關係配置

      column 填寫 你引用對方實體的 對應的外來鍵名稱 rid

      -->
      <!--配置多對多關係-->
      <set name="routes" cascade="all" inverse="true" table="tb_hero_route">
      <key column="hid"></key>
      <many-to-many column="rid" class="Route"></many-to-many>
      </set>
      </class>
      </hibernate-mapping>
      <!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
      <hibernate-mapping package="cn.edu.dgut.bean">
      <!--ORM 對映 實體類和 資料表對映-->
      <class name="Route" table="tb_route">
      <id name="routeid" column="routeid">
      <!--設定主鍵策略-->
      <generator class="native"></generator>
      </id>
      <property name="routename" column="routename"></property>

      <!--配置多對多關係-->
      <set name="heroes" table="tb_hero_route" >
      <key column="rid"></key>
      <many-to-many column="hid" class="Hero"></many-to-many>
      </set>
      </class>

      </hibernate-mapping>
    • HibernateUtil和hibernate.cfg.xml(關聯ORM對映檔案即可)基本不變

    • 測試類

      public class HbmDemo01 {
      @Test
      public void save() {
      // 呼叫工具類,得到一個會話物件
      Session session = HibernateUtil.getSession();
      // 開啟事務
      Transaction transaction = session.beginTransaction();

      // 建立一個使用者物件,並設定屬性初始值
      Hero hero = new Hero();
      hero.setHeroname("嘉文四世");
      hero.setPassword("123456");
      hero.setAddress("德瑪西亞");

      Hero hero2 = new Hero();
      hero2.setHeroname("蓋倫");
      hero2.setPassword("666888");
      hero2.setAddress("德瑪西亞");

      // 建立路線物件,並設定屬性初始值
      Route route1 = new Route();
      route1.setRoutename("中路");
      Route route2 = new Route();
      route2.setRoutename("上路");
      Route route3 = new Route();
      route3.setRoutename("打野");

      // 將路線和英雄關聯
      hero.getRoutes().add(route1);
      hero.getRoutes().add(route2);
      hero.getRoutes().add(route3);

      // 將英雄和路線關聯
      route1.getHeroes().add(hero);
      route2.getHeroes().add(hero);
      route3.getHeroes().add(hero);

      hero2.getRoutes().add(route1);
      hero2.getRoutes().add(route2);
      hero2.getRoutes().add(route3);

      route1.getHeroes().add(hero2);
      route2.getHeroes().add(hero2);
      route3.getHeroes().add(hero2);

      // 操作資料庫,進行插入資料
      session.save(hero);
      session.save(hero2);

      // 提交事務
      transaction.commit();

      }
      }

本文是學習hibernate的個人總結,僅供參考,歡迎大家批評指正。

參考連結:https://www.w3cschool.cn/hibernate/npyd1iek.html