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

Java 計數器教學(七):Hibernate 版——ORM 持久化與 Spring 整合

     編輯:Java 相關知識

系列最終篇:引入 Hibernate ORM 替換手寫持久化,配合 Spring 容器 管理 Bean 生命週期與事務,實現生產級計數器:分層清晰、配置驅動、支援集群、可擴展緩存。

實體映射

Hibernate 版計數器截圖


@Entity @Table(name = "counter")
public class Counter {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "count_value") private long countValue;
    @Version private int version; // 樂觀鎖
    // getter/setter
}

DAO 層


@Repository
public class CounterDao {
    @Autowired private SessionFactory sessionFactory;
    private Session getSession() { return sessionFactory.getCurrentSession(); }

    public Counter findForUpdate() {
        return (Counter) getSession().createQuery(
            "FROM Counter WHERE id = 1").setLockMode(LockMode.PESSIMISTIC_WRITE).uniqueResult();
    }
    public void saveOrUpdate(Counter c) { getSession().saveOrUpdate(c); }
}

Service 層


@Service @Transactional
public class CounterService {
    @Autowired private CounterDao counterDao;

    public long incrementAndGet() {
        Counter c = counterDao.findForUpdate(); // 悲觀鎖 SELECT FOR UPDATE
        c.setCountValue(c.getCountValue() + 1);
        counterDao.saveOrUpdate(c);
        return c.getCountValue();
    }
}

Spring 配置片段


<context:component-scan base-package="com.counter"/>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="com.counter.model"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

JSP 頁面(極簡)


<%@ page import="com.counter.service.CounterService" %>
<% 
    CounterService svc = (CounterService) application.getAttribute("counterService");
    if (svc == null) { // 簡易取得 Spring Bean,生產用 WebApplicationContextUtils
        svc = (CounterService) new ClassPathXmlApplicationContext("applicationContext.xml").getBean("counterService");
        application.setAttribute("counterService", svc);
    }
    long count = svc.incrementAndGet();
%>
當前訪問次數:<%= count %>

七版本演進總結

版本持久化併發控制架構適用場景
1. 第一版application 域無Scriptlet單機測試、極低併發
2. 修正版application 域synchronizedScriptlet單機、中低併發
3. 檔案版本地檔案synchronizedScriptlet單機、需重啟保留
4. JDBC 版MySQLSELECT FOR UPDATE (行鎖)Scriptlet + JNDI集群、強一致性
5. JavaBean 版application/檔案/DB封裝於 Bean分層 (POJO)教學、邏輯復用
6. Hibernate 版MySQL (ORM)悲觀鎖/樂觀鎖 + @TransactionalSpring + 分層企業級生產環境

核心最佳實踐

  • 分層解耦:Controller/JSP → Service → DAO → Entity,各層單一職責。
  • 事務註解:@Transactional 聲明式事務,避免手動 try-catch-commit/rollback。
  • 樂觀鎖優先:@Version 適合低衝突場景,高衝突改悲觀鎖 LockMode.PESSIMISTIC_WRITE。
  • 容器管理 Bean:Spring 控制生命週期、注入依賴、AOP 橫切關注點(事務、日誌、快取)。
  • 配置外部化:DataSource、Hibernate 參數、連接池參數全在 XML/Properties,環境遷移零代碼改動。

計數器教學系列完結,這套演進邏輯可直接映射到任何「讀-改-寫」熱點業務(庫存扣減、點讚計數、API 限流)的架構升級路徑。

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