首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MyBatis Update 報「不允許的操作」:關閉 useGeneratedKeys 解決 Oracle 主鍵回填衝突

     編輯:程式設計綜合問答

錯誤堆疊關鍵行

Caused by: java.sql.SQLException: 不允許的操作
    at oracle.jdbc.driver.OracleStatement.getGeneratedKeys(OracleStatement.java:4568)
    at org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator.processBatch(Jdbc3KeyGenerator.java:51)

MyBatis 默認 useGeneratedKeys=true,執行 INSERT/UPDATE 後均嘗試調用 getGeneratedKeys() 回填主鍵。Oracle 不支持 UPDATE 返回生成鍵,拋出異常。

解決方案

@UpdateProvider(type = CRUDTemplate.class, method = "update")
@Options(useGeneratedKeys = false)  // 關鍵:禁用主鍵回填
public int update(T entity);

同理 INSERT 需保持開啟

@InsertProvider(type = CRUDTemplate.class, method = "insert")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
public int insert(T entity);

原理補充

  • MyBatis 通過 Jdbc3KeyGenerator 在 PreparedStatement.executeUpdate() 後調用 getGeneratedKeys()。
  • Oracle INSERT 配合 RETURNING id INTO ? 或序列/觸發器可工作,但 UPDATE 無生成鍵語義。
  • @Options 註解屬於方法級配置,精確控制每條語句行為。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved