本教學將引導您完成一個企業級示範應用的構建,整合 Spring AOP 宣告式事務 與 Spring-Hibernate 持久化主幹,針對 DB2 資料庫實現部門/員工領域模型的 CRUD 操作。涵蓋三大持久化技術對比、環境搭建、ORM 映射、DAO 編織、事務攔截與部署驗證全流程。
| 框架 | 定位 | 核心優勢 | 適用場景 |
|---|---|---|---|
| JDO | 標準化 Java 持久化抽象 (JSR) | 可移植、資料庫無關、專注領域模型、高性能優化 | 需跨多種資料存儲(關係/對象/文件)的應用 |
| JDBC 3.0 | Java 標準資料庫連接 API | 直接控制、成熟穩定、支援自動生成鍵/多結果集/連接池增強 | 需要精細控制 SQL、存儲過程、批次操作的場景 |
| Hibernate | 開源 ORM 事實標準 | 豐富映射(關聯/繼承/多態)、HQL/原生 SQL/準則查詢、Spring 深度整合、社區活躍 | 複雜領域模型、快速開發、需保留 SQL 能力的企業應用 |
JDBC 3.0 亮點示例 —— 自動生成鍵獲取:
Statement stmt = conn.createStatement();
stmt.executeUpdate(
"INSERT INTO Accounts (account_name, balance) VALUES ('Smith Savings', 500.00)",
Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) { int accountId = rs.getInt(1); }
orgdb,表 TBL_DEPARTMENT (1) ↔ (N) TBL_EMPLOYEEDepartment (id, name, Set<Employee>) / Employee.hbm.xml) + Spring LocalSessionFactoryBeanDepartmentDAOImpl extends HibernateDaoSupport 使用 HibernateTemplateTransactionProxyFactoryBean 攔截 addDepartment,屬性 PROPAGATION_REQUIRED<bean id="exampleDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"><value>com.ibm.db2.jcc.DB2Driver</value></property> <!-- Type 4 驅動 -->
<property name="url"><value>jdbc:db2://localhost:50000/orgdb</value></property>
<property name="username"><value>db2admin</value></property>
<property name="password"><value>db2admin</value></property>
</bean>
<bean id="exampleHibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.DB2Dialect</prop> <!-- 關鍵:告知 Hibernate 使用 DB2 方言 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.c3p0.minPoolSize">5</prop>
<prop key="hibernate.c3p0.maxPoolSize">20</prop>
</props>
</property>
</bean>
<bean id="exampleSessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource"><ref local="exampleDataSource"/></property>
<property name="hibernateProperties"><ref bean="exampleHibernateProperties"/></property>
<property name="mappingResources">
<list><value>Department.hbm.xml</value><value>Employee.hbm.xml</value></list>
</property>
</bean>
<class name="springexample.db2persist.hibernate.Department" table="TBL_DEPARTMENT">
<id name="id" column="DEPARTMENT_ID" type="java.lang.Long">
<generator class="native"/> <!-- 使用 DB2 IDENTITY 序列 -->
</id>
<set name="employees" inverse="true" cascade="all-delete-orphan">
<key column="EMPLOYEE_ID"/>
<one-to-many class="springexample.db2persist.hibernate.Employee"/>
</set>
<property name="name" column="DEPARTMENT_NAME" length="60" not-null="true"/>
</class>
public class DepartmentDAOImpl extends HibernateDaoSupport implements DepartmentDAO {
public void addDepartment(Department dept) {
getHibernateTemplate().save(dept); // 模板簡化 Session 管理
}
public Department getDepartmentEmployees(Department dept) {
List list = getHibernateTemplate().find(
"from Department d where d.id = ?", dept.getId(), Hibernate.LONG);
return (list.size() > 0) ? (Department) list.get(0) : null;
}
}
<!-- 事務代理 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory"><ref bean="exampleSessionFactory"/></property>
</bean>
<bean id="departmentDAOTarget" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref local="transactionManager"/></property>
<property name="target"><ref local="departmentDAO"/></property>
<property name="transactionAttributes">
<props><prop key="addDepartment">PROPAGATION_REQUIRED</prop></props>
</property>
</bean>
PROPAGATION_REQUIRED 等同 EJB TX_REQUIRED:有事務則加入,無則新建。若需強制新事務可用 PROPAGATION_REQUIRES_NEW。
db2jcc.jar)C:\DB2SpringHBbuild.xml 中 Spring 安裝路徑與 DB2 驅動路徑build → 編譯、打包、運行 CreateDepartmentEmployeeClientdb2 connect to orgdb → select * from tbl_department / select * from tbl_employeehibernate.dialect (如 Derby 用 DerbyDialect) 與 DataSource URL@Entity, @OneToMany) 取代 .hbm.xml@Transactional 註解 + <tx:annotation-driven/> 替代 TransactionProxyFactoryBean