Spring 系列最後一課:首次真正實現 Spring + Hibernate + 數據庫端到端整合,完成增刪改查全流程。

// Users.java
@Entity @Table(name="USERS", schema="SCOTT")
public class Users implements Serializable {
@Id @GeneratedValue(generator="seq") @GenericGenerator(name="seq", strategy="sequence", parameters=@Parameter(name="sequence", value="USERS_SEQ"))
private Integer id;
private String name;
private Date regTime;
// getter/setter/toString
}
// Users.hbm.xml
<hibernate-mapping package="www.csdn.spring.hibernate.domain">
<class name="Users" table="USERS" schema="SCOTT">
<id name="id" column="ID">
<generator class="sequence"><param name="sequence">USERS_SEQ</param></generator>
</id>
<property name="name" column="NAME"/>
<property name="regTime" column="REGTIME" type="timestamp"/>
</class>
</hibernate-mapping>
// UsersDao.java
public interface UsersDao {
void save(Users entity);
void deleteById(Class clazz, Integer id);
List getObjects(Class clazz);
void update(Users entity);
}
// UsersDaoImpl.java
public class UsersDaoImpl implements UsersDao {
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; }
@Override public void save(Users entity) { hibernateTemplate.save(entity); }
@Override public List getObjects(Class clazz) { return hibernateTemplate.find("from " + clazz.getName()); }
@Override public void deleteById(Class clazz, Integer id) { hibernateTemplate.bulkUpdate("delete from " + clazz.getName() + " where id=" + id); }
@Override public void update(Users entity) { hibernateTemplate.update(entity); }
}
public class UserTest {
@Test public void save() {
ApplicationContext ac = new ClassPathXmlApplicationContext("app*.xml");
UsersDao dao = ac.getBean("usersDaoImpl", UsersDao.class);
dao.save(new Users(null, "chrp999999999", new Date()));
}
@Test public void getObjects() { ... }
@Test public void delete() { ... }
@Test public void update() { ... }
}
// jdbc.properties
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.username=scott
jdbc.password=tiger
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
// applicationContext.xml
<context:property-placeholder location="jdbc.properties"/>
<import resource="spring.xml"/>
<import resource="spring-dao.xml"/>
// spring.xml (核心:DataSource + SessionFactory + HibernateTemplate + 事務)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="url" value="${jdbc.url}"/>
</bean>
<bean id="localSessionFactoryBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources"><value>www/csdn/spring/hibernate/domain/Users.hbm.xml</value></property>
<property name="hibernateProperties">
<props><prop key="show_sql">true</prop><prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop></props>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="localSessionFactoryBean"/>
</bean>
<bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="localSessionFactoryBean"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="hibernateTransactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- AOP 切面配置註釋掉,僅演示事務定義 -->
// spring-dao.xml
<bean id="usersDaoImpl" class="www.csdn.spring.hibernate.dao.UsersDaoImpl">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>

tx:advice + 方法名模式匹配,業務代碼零事務侵入此配置模式為經典 Spring 2.5/3.x + Hibernate 3.x 黃金組合,現代項目建議升級至 Spring Boot + Spring Data JPA / Hibernate 5+,簡化配置達 80% 以上。