Hibernate 作為經典 ORM 框架,通過簡單配置替代繁瑣 JDBC 代碼。本文梳理 **Jar 依賴、hibernate.cfg.xml 核心配置、實體映射文件、Spring 容器整合、SessionFactory 構建與事務模板使用** 的完整步驟,代碼可直接複製到項目中運行。
<dependencies>
<!-- Hibernate 核心 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.15.Final</version>
</dependency>
<!-- Spring ORM 整合包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.27</version>
</dependency>
<!-- 數據庫驅動(以 Oracle 為例) -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.9.0.0</version>
</dependency>
<!-- 連接池 HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
</dependencies>
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"https://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 數據源配置 -->
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="hibernate.connection.username">WZ</property>
<property name="hibernate.connection.password">*****</property>
<!-- 方言 & 優化 -->
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 實體映射文件引用 -->
<mapping resource="com/entity/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.entity">
<class name="Student" table="T_STUDENT">
<id name="id" column="STU_NO">
<generator class="sequence">
<param name="sequence">SEQ_STUDENT</param>
</generator>
</id>
<property name="name" column="STU_NAME"/>
<property name="age" column="STU_AGE"/>
</class>
</hibernate-mapping>
主鍵生成策略:increment(內存自增)、sequence(數據庫序列)、identity(自增列)、native(自適應)、assigned(手動分配)。
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:tx="https://www.springframework.org/schema/tx"
xmlns:context="https://www.springframework.org/schema/context">
<!-- 數據源 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="WZ"/>
<property name="password" value="*****"/>
</bean>
<!-- SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
<property name="packagesToScan" value="com.entity"/>
</bean>
<!-- 事務管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 註解驅動事務 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<context:component-scan base-package="com"/>
</beans>
@Repository
public class StudentDao {
@Autowired private SessionFactory sessionFactory;
public void save(Student s) { sessionFactory.getCurrentSession().save(s); }
}
@Service
@Transactional
public class StudentService {
@Autowired private StudentDao dao;
public void register(Student s) { dao.save(s); }
}
hibernate.current_session_context_class=thread 確保 Spring 管理的 Session 與線程綁定;hbm2ddl.auto=update 僅開發環境使用,生產建議 validate 或由 Flyway/Liquibase 管理結構;@Transactional 聲明,避免在 DAO 層手動控制事務。