使用 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 屬性。
mybatis-config.xml 指定代理工廠為 CGLIB:<setting name="proxyFactory" value="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 後,更新操作不再嘗試回填主鍵,異常消失。