專案

一般

配置概況

動作

Bug #1344

已結束

[Branch] hibernate_sequence 缺 e_connector_priority 註冊,導致 ConnectorPriority INSERT 拋 SQL Error (patch 流程防呆)

是由 陳國瑋約 2 個月 前加入. 於 21 天 前更新.

狀態:
Closed
優先權:
Normal
被分派者:
開始日期:
2026-06-18
完成日期:
預估工時:

概述

問題描述

EMS branch 部署時,hibernate_sequence table 漏註冊 e_connector_priority 序列。當任何業務流程嘗試 INSERT 新的 ConnectorPriority 記錄時,Hibernate 透過 IdGeneratorUtil.nextIdFromSequence() 查不到對應 sequence,會拋出 Sequence not found: e_connector_priority 錯誤,導致整個 transaction rollback。

影響範圍

  • 影響案場
    • a17 (寶台 A17)
    • ct1 (寶台 A17) - 同一個案場的不同站台,缺同一個 sequence
  • 影響功能:所有需要 INSERT e_connector_priority 的流程
    • 充電樁進入 PREPARING/CHARGING 狀態時,自動建立 ConnectorPriority 記錄 (ChargingOrchestrator.upsertQueueForStatusNotification)
    • 離峰充電手動入列 (ChargeRotationAdminController)
  • 錯誤訊息
    WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 0, SQLState: null
    ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Sequence not found: e_connector_priority
    
  • 連帶影響:因為 transaction rollback,旋轉模式 reset queue 失敗 → 觸發後續 ENQUEUED 卡住、無法充電

復現

  1. 部署新版本的 ems_branch(包含 e_connector_priority table)
  2. 任一充電樁進入 CHARGING/PREPARING 狀態 → 觸發 upsertQueueForStatusNotification
  3. 觀察 log 出現:
    Sequence not found: e_connector_priority
    
  4. e_connectors 狀態無法從 ENQUEUED 推進

實際案例 (a17 log, 2026-06-18)

00:00:00 WARN  hibernate_sequence table 沒有這個 sequence_name:e_connector_priority
07:30:00 WARN  hibernate_sequence table 沒有這個 sequence_name:e_connector_priority
07:39:30 WARN  hibernate_sequence table 沒有這個 sequence_name:e_connector_priority
13:53:27 ERROR Sequence not found: e_connector_priority  ← 第一個 ERROR (華城充電樁觸發)
14:00:50 ERROR Sequence not found: e_connector_priority  ← (華城充電樁觸發)
14:32:40 ERROR Sequence not found: e_connector_priority  ← (CloudLink CP003-008 觸發)

DB 現況驗證

SELECT * FROM hibernate_sequence WHERE sequence_name LIKE 'e_%';
-- 結果:只有 e_user_building (next_val=17),沒有 e_connector_priority

根本原因

patch_20251231.sql 只建了 e_connector_priority table,但忘了 INSERT 對應的 sequence 記錄。SS3A 框架的 IdGeneratorUtil.nextIdFromSequence() 透過 hibernate_sequence table 管理所有 entity 的 ID,需要手動註冊每個 table 的 sequence。

修法方向(待 Ken 確認)

方案 A(推薦):補登 sequence + patch 流程防呆

  1. 立即補登
    INSERT IGNORE INTO hibernate_sequence (sequence_name, next_val)
    VALUES ('e_connector_priority', 1);
    
  2. patch 流程防呆:未來新增 entity table 時,patch SQL 必須同步 INSERT sequence 記錄
  3. deploy checklist:deploy 腳本檢查所有 entity table 都有對應 sequence

方案 B:徹底改用 AUTO_INCREMENT

  • e_connector_priority.id 改為 BIGINT AUTO_INCREMENT,移除 @PrefixDateSequence
  • 同步檢查其他 entity 是否有同樣漏註冊風險
  • 影響範圍較大,需全面測試

方案 C:framework 端 startup check

  • SS3A 啟動時掃描所有 @Entity,比對 hibernate_sequence 是否都有對應記錄
  • 缺漏時 warn log + 自動 INSERT(需 framework 共識)

建議採用:A 立即補登 + C 開案追 framework 防呆

暫時補救 SQL

-- 補登 e_connector_priority sequence
INSERT IGNORE INTO hibernate_sequence (sequence_name, next_val)
VALUES ('e_connector_priority', 1);

參考資訊

  • 受影響案場:a17 / ct1
  • 受影響 entity:com.sylksoft.ems.branch.model.ConnectorPriority
  • 受影響 table:e_connector_priority
  • 呼叫路徑:ChargingOrchestrator.upsertQueueForStatusNotification()connectorPriorityRepository.save()IdGeneratorUtil.nextIdFromSequence("e_connector_priority")
  • 相關 commit:build e_connector_priority table 的 patch_20251231.sql
  • Branch:private
動作

匯出至 Atom PDF