<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") |
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+用MySQL8Dialecthibernate.show_sql:控制台輸出SQL,開發期必開hibernate.format_sql:美化SQL輸出,提升可讀性addAnnotatedClass逐個添加麻煩,生產用packagesToScan掃描整個包conf.setProperty("packagesToScan", "com.ij34.dao");com.mysql.cj.jdbc.Driver (舊版com.mysql.jdbc.Driver已棄用)serverTimezone=UTC或Asia/Shanghai避免時區警告後續將講解:關聯映射(@OneToMany/@ManyToOne)、複合主鍵(@EmbeddedId/@IdClass)、繼承映射策略、緩存註解(@Cacheable)、自定義類型轉換(@Convert)。敬請期待!