首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Hibernate註解配置實戰(一):純註解無XML映射的快速入門

     編輯:Java 綜合教學

環境準備:Maven核心依賴

<dependencies>
    <!-- Hibernate 5.x 核心 -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.6.15.Final</version>
    </dependency>
    <!-- MySQL驅動 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    <!-- JPA API (javax.persistence) -->
    <dependency>
        <groupId>jakarta.persistence</groupId>
        <artifactId>jakarta.persistence-api</artifactId>
        <version>3.1.0</version>
    </dependency>
</dependencies>

實體類註解映射

package com.ij34.dao;

import javax.persistence.*;

@Entity                          // 標識為持久化實體
@Table(name = "test01")          // 指定映射表名,默認類名
public class New {
    @Id                          // 主鍵
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增策略
    private int id;

    @Column(name = "title", length = 100, nullable = false)
    private String title;

    @Column(name = "content", columnDefinition = "TEXT")
    private String content;

    // Getter/Setter 省略...
}

常用註解速查:

註解作用關鍵屬性
@Entity聲明實體類name: 實體名稱(HQL用)
@Table映射數據表name, schema, catalog
@Id主鍵字段無
@GeneratedValue主鍵生成策略strategy: AUTO/IDENTITY/SEQUENCE/TABLE
@Column字段映射細節name, nullable, unique, length, columnDefinition
@Transient非持久化字段無
@Lob大對象映射配合@Column(columnDefinition="TEXT/BLOB")

SessionFactory構建:標準ServiceRegistry模式

package com.ij34.web;

import org.hibernate.*;
import org.hibernate.boot.registry.*;
import org.hibernate.cfg.*;
import org.hibernate.service.*;
import com.ij34.dao.New;

public class Test01 {
    public static void main(String[] args) throws Exception {
        // 1. 配置對象:程式化配置替代hibernate.cfg.xml
        Configuration conf = new Configuration()
            .addAnnotatedClass(New.class)           // 掃描註解實體
            .setProperty("hibernate.connection.driver_class", "com.mysql.cj.jdbc.Driver")
            .setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/hibernate?useSSL=false&serverTimezone=UTC")
            .setProperty("hibernate.connection.username", "root")
            .setProperty("hibernate.connection.password", "123456")
            .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect")
            .setProperty("hibernate.show_sql", "true")
            .setProperty("hibernate.format_sql", "true")
            .setProperty("hibernate.hbm2ddl.auto", "update"); // create/update/validate/none

        // 2. 構建ServiceRegistry (Hibernate 4+ 必須)
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
            .applySettings(conf.getProperties())
            .build();

        // 3. 構建SessionFactory (重量級、線程安全、單例)
        SessionFactory sessionFactory = conf.buildSessionFactory(serviceRegistry);

        // 4. 開啟Session (輕量級、非線程安全、請求級)
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();

        try {
            // 業務操作
            New news = new New();
            news.setTitle("Hibernate註解入門");
            news.setContent("純註解配置,無需hbm.xml映射文件");
            session.save(news);

            tx.commit();
            System.out.println("保存成功,ID: " + news.getId());
        } catch (Exception e) {
            tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
            sessionFactory.close(); // 應用關閉時調用
        }
    }
}

關鍵配置項詳解

  • hibernate.hbm2ddl.auto:create啟動時刪表建表(僅測試) | update自動更新結構(開發) | validate僅校驗(生產) | none禁用
  • hibernate.dialect:MySQL 5.x用MySQL5InnoDBDialect,8.0+用MySQL8Dialect
  • hibernate.show_sql:控制台輸出SQL,開發期必開
  • hibernate.format_sql:美化SQL輸出,提升可讀性

常見坑點避雷

  1. 包掃描路徑:addAnnotatedClass逐個添加麻煩,生產用packagesToScan掃描整個包
    conf.setProperty("packagesToScan", "com.ij34.dao");
  2. MySQL 8.0+ 驅動類名:com.mysql.cj.jdbc.Driver (舊版com.mysql.jdbc.Driver已棄用)
  3. 時區問題:URL加serverTimezone=UTC或Asia/Shanghai避免時區警告
  4. IDENTITY策略:依賴數據庫自增,MySQL/PostgreSQL/SQL Server支持,Oracle需用SEQUENCE

下一步預告

後續將講解:關聯映射(@OneToMany/@ManyToOne)、複合主鍵(@EmbeddedId/@IdClass)、繼承映射策略、緩存註解(@Cacheable)、自定義類型轉換(@Convert)。敬請期待!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved