Hibernate 零配置之Annotation註解

来源:http://www.cnblogs.com/zhaozihan/archive/2016/08/28/5814449.html
-Advertisement-
Play Games

JPA規範推薦使用Annotation來管理實體類與數據表之間的映射關係,從而避免同時維護兩份文件(Java 實體類 和 XML 映射文件),將映射信息(寫在Annotation中)與實體類集中在一起。 以下我將使用eclipse來構建一個簡單使用註解取代*.hbm.xml的查詢小例子。(p.s 建 ...


  JPA規範推薦使用Annotation來管理實體類與數據表之間的映射關係,從而避免同時維護兩份文件(Java 實體類 和 XML 映射文件),將映射信息(寫在Annotation中)與實體類集中在一起。

  以下我將使用eclipse來構建一個簡單使用註解取代*.hbm.xml的查詢小例子。(p.s 建議不要使用Myeclipse,他很方便但是對於初學者來說沒有eclipse學得牢靠)

1.在資料庫中構建一張表

 

2.生成相應的hibernate.cfg.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!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.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/zzh</property>
        <property name="hibernate.connection.username">root</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
    </session-factory>
</hibernate-configuration>
View Code

註意,在生成cfg.xml文件時,要create Hibernate Console Configuration

3.生成hibernate.reveng.xml逆向工程

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >

<hibernate-reverse-engineering>
  <table-filter match-catalog="zzh" match-name="commodity"/>
</hibernate-reverse-engineering>
View Code

在Eclipse界面工具欄,擇Hibernate code generation Configuration,new 一個新的配置。

4.選擇Exporters的選項,接下來是重點!!!

選擇勾選的兩項,不再選.hbm.xml.

點擊Run。

5.只生成了與數據表對應的實體類Commodity.java,而沒有生成與該實體類對應的映射文件Commodity.hbm.xml,打開實體類

package com.zzh;
// Generated 2016-8-28 9:42:01 by Hibernate Tools 4.3.1.Final

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * Commodity generated by hbm2java
 */
@Entity
@Table(name = "commodity", catalog = "zzh")
public class Commodity implements java.io.Serializable {

    private Integer id;
    private String name;
    private Double price;
    private String unit;
    private String category;
    private String description;
    private Integer seller;

    public Commodity() {
    }

    public Commodity(String name, Double price, String unit, String category, String description, Integer seller) {
        this.name = name;
        this.price = price;
        this.unit = unit;
        this.category = category;
        this.description = description;
        this.seller = seller;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)

    @Column(name = "Id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

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

    @Column(name = "name", length = 100)
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "price", precision = 11)
    public Double getPrice() {
        return this.price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Column(name = "unit", length = 50)
    public String getUnit() {
        return this.unit;
    }

    public void setUnit(String unit) {
        this.unit = unit;
    }

    @Column(name = "category", length = 100)
    public String getCategory() {
        return this.category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    @Column(name = "description", length = 1000)
    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Column(name = "seller")
    public Integer getSeller() {
        return this.seller;
    }

    public void setSeller(Integer seller) {
        this.seller = seller;
    }

}

使用@Entity註解,表示當前類為實體Bean,需要進行持久化,使用@Table註解實現數據表 commodity 與持久化類Commodity之間的映射,@Id註解指定當前持久化類的ID屬性,使用@GeneratedValue註解指定ID表示生成器,使用@Column註解指定當前屬性所對應的數據表中的欄位,name指定欄位名;unique指定是否為唯一,nullable指定是否可為null。

6.在hibernate.cfg.xml中配置映射信息

  <mapping class="com.zzh.Commodity"/>

一定要註意mapping後面是class,如果是配置*.hbm.xml就是resource

7.添加會話工廠類HibernateUtil以獲取Session

package com.zzh.utl;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private static Session session;

    static {
        // 創建Configuration對象,讀取hibernate.cfg.xml文件,完成初始化
        Configuration config = new Configuration().configure();
        StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
                .applySettings(config.getProperties());
        StandardServiceRegistry ssr=ssrb.build();
        sessionFactory=config.buildSessionFactory(ssr);
    }
    
    //獲取SessionFactory
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }
    
    //獲取Session
    public static Session getSession(){
        session=sessionFactory.openSession();
        return session;
    }
    
    //關閉Session
    public static void closeSession(Session session){
        if(session!=null){
            session.close();
        }
    }
}
View Code

8.用JUnit創建一個類ZhuShi.java用於測試

package anno;

import static org.junit.Assert.*;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.hibernate.annotations.*;

import com.zzh.Commodity;
import com.zzh.utl.HibernateUtil;

public class ZhuShi {
    Session session = null;
    @Before
    public void setUp() throws Exception {
        session = HibernateUtil.getSession();
    }

    @After
    public void tearDown() throws Exception {
        session.close();
    }

    @Test
    public void test() {
        String hql = " from Commodity ";
        Query query = session.createQuery(hql);
        List<Commodity> c = query.list();
        for (Commodity commodity : c) {
            System.out.println("name"+commodity.getName());
        }
    }

}

9.整個文件已經形成

運行測試,得到結果

10.總結

  原來大量的*.hbm.xml文件不再需要了,所有的配置都通過Annotation註解直接在持久化類中配置完成。

11.個人想法

  之前我有過不用註解後來因為路徑調試半天的經歷,那時自己也是笨,我就跟大家講講;我當時也是用反向工程生成實體類,還有*.hbm.xml文件,當時的hbm.xml文件如下所示:(註意看我紅筆畫出的部分)

 

由於是工具幫我生成的我也沒在意,然後高高興興去配置cfg.xml文件去了(如下所示):

 

全部文件如下所示:

以為一切順利,便用JUnit進行測試:

實體類無法找到,坑爹呀,我都是按工具一步一步來的呀,為什麼會這樣,後來才發現*.hbm.xml中class便簽中name出錯了,必須加上包名才行:

再進行測試:

  總算成功了,這不代表*.hbm.xml不好,其實主要還是怪自己經驗不足,亂用工具,初學者還是多用*.hbm.xml文件要好,畢竟能更好掌握其中的元素和映射信息與方式,不過就以後熟練後,還是用註釋更為簡潔和方便管理。

  在這之後我會繼續寫一些關聯映射的註釋案例(比如雙向一對多和雙向多對多),如果你覺得還不錯,請繼續關註我或幫我點贊,謝謝觀看!

                                                                                                                  ---參考資料《Struts2+Spring3+Hibernate框架技術精講與整合案例》


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

-Advertisement-
Play Games
更多相關文章
  • 序列(sequence)【題目描述】蛤布斯有一個序列,初始為空。它依次將 1-n 插入序列,其中 i插到當前第 ai 個數的右邊 (ai=0 表示插到序列最左邊)。它希望你幫它求出最終序列。【輸入數據】第一行一個整數 n。第二行 n 個正整數 a1~an。【輸出數據】輸出一行 n 個整數表示最終序列... ...
  • 由於使用DriverManager獲取資料庫連接時,由於DriverManager實現類中有一段靜態代碼塊,可以直接註冊驅動,且可以同時管理多個驅動程式 所以當換資料庫連接時需要指定不同的資料庫,那麼就需要反覆修改properties配置文件(雖然並不麻煩),所以我想將每種驅動連接程式的proper ...
  • 數組對每門編程語言都是重要的數據結構之一,java語言提供的數組是用來儲存固定大小的同類型元素的。 當你需要保存一組數據類型相同的變數或者對象時,我們不可能給每個變數都定義一個變數名,這樣的操作會使代碼臃腫、工作量大且無意義。這時我們就需要數組來保存這些數據。數組根據需要的不同分為一維數,二維數組和 ...
  • 先看一下文件,在當前包下有一個properties配置文件,在根目錄下有一個lib文件夾,裡面放的是mySql的驅動jar包 Driver :是一個介面,資料庫廠商必須提供實現的介面,能從其中獲取資料庫連接 可以通過Driver的實現類的對象獲取資料庫連接 * 1.加入mySql驅動 * 1.1 解 ...
  • 一、MyBaris簡介 1)MyBaris發展過程 MyBatis的前身叫iBatis,本是apache的一個開源項目, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為MyBatis。 MyBatis是支持普通SQL查詢,存儲過程 ...
  • (一) 接需求 : 需求相關 (貼圖 ) 生成三核對文件 1、新增三核對菜單頁面中,增加生成三核對文件功能按鈕,彈窗可根據變電站、電壓等級查詢定值單。 2、定值單信息以表格形式展示,根據選擇情況,生成三核對文件。 整體就是這樣的一個需求,分sheet,合併單元格,設置各種單元格格式,要有序號。 (二 ...
  • Mybatis是輕量級的持久化框架,的確上手非常快. Mybatis大體上的思路就是由一個總的config文件配置全局的信息,比如mysql連接信息等。然後再mapper中指定查詢的sql,以及參數和返回值。 在Service中直接調用這個mapper即可。 依賴的jar包 主要的mybatis配置 ...
  • ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...