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

MyBatis SQL Server @Update 回填主鍵異常:Javassist 與 CGLIB 代理衝突

     編輯:程式設計綜合問答

使用 MyBatis 3.3.0 對 SQL Server 執行 @Update 時,雖然資料正常更新,卻拋出 ExecutorException: Error getting generated key ... Could not set property 'id' ... with value 'null'。

根因

MyBatis 預設使用 Javassist 產生 Mapper 代理,某些情況下會誤將 UPDATE 視為 INSERT 並嘗試回填自增主鍵,導致嘗試將 null 設給 id 屬性。

解決方案

  1. 在 mybatis-config.xml 指定代理工廠為 CGLIB:
<setting name="proxyFactory" value="CGLIB" />
  1. 或在 Maven 依賴中排除 Javassist、顯式引入 CGLIB:
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.3.0</version>
  <exclusions>
    <exclusion>
      <groupId>org.javassist</groupId>
      <artifactId>javassist</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>3.3.0</version>
</dependency>

切換為 CGLIB 後,更新操作不再嘗試回填主鍵,異常消失。

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