BIGINT UNSIGNED 自动增量被 mybatis 破坏
BIGINT UNSIGNED auto increment broken with mybatis
所以我有:
一个PK栏目:
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT
具有 id
字段的 POJO 实体
java.math.BigInteger id field
映射器插入方法:
@Insert("INSERT INTO " +
"table_name (" +
"created_at_ts, " +
"updated_at_ts" +
") " +
"VALUES (" +
"UNIX_TIMESTAMP(), " +
"UNIX_TIMESTAMP()" +
")")
@Options(useGeneratedKeys = true, keyColumn = "id")
void insert(Entity entity);
像这样调用映射器插入方法:
commandMapper.insert(entity);
在成功插入一定数量的行之前,所有这些都工作得很好。在 child table:
中插入一行时突然出现以下错误
org.springframework.dao.DataIntegrityViolationException:
### Error updating database. Cause: java.sql.BatchUpdateException:
Out of range value for column 'parent_id' at row 1
看起来下面的结果没问题:
SELECT Auto_increment FROM information_schema.tables WHERE
table_name='table';
-> 32770
但是实体的BigInteger id字段的值是错误的:
System.out.println(entity.getId());
-> -32767
如何才能在实体 POJO 中得到负值?
显然:
- 使用
BigIntegerTypeHandler
没有解决问题
- 从
BIGINT UNSIGNED
切换到 INT UNSIGNED
以及从 java.math.BigInteger
切换到 Long
修复它。
但也许还有其他方法?
非常感谢。
不得不修改 spring-jdbc 和 mariadb-java-client 来解决这个问题。
所以我有:
一个PK栏目:
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT
具有
id
字段的 POJO 实体java.math.BigInteger id field
映射器插入方法:
@Insert("INSERT INTO " + "table_name (" + "created_at_ts, " + "updated_at_ts" + ") " + "VALUES (" + "UNIX_TIMESTAMP(), " + "UNIX_TIMESTAMP()" + ")") @Options(useGeneratedKeys = true, keyColumn = "id") void insert(Entity entity);
像这样调用映射器插入方法:
commandMapper.insert(entity);
在成功插入一定数量的行之前,所有这些都工作得很好。在 child table:
中插入一行时突然出现以下错误 org.springframework.dao.DataIntegrityViolationException:
### Error updating database. Cause: java.sql.BatchUpdateException:
Out of range value for column 'parent_id' at row 1
看起来下面的结果没问题:
SELECT Auto_increment FROM information_schema.tables WHERE
table_name='table';
-> 32770
但是实体的BigInteger id字段的值是错误的:
System.out.println(entity.getId());
-> -32767
如何才能在实体 POJO 中得到负值?
显然:
- 使用
BigIntegerTypeHandler
没有解决问题 - 从
BIGINT UNSIGNED
切换到INT UNSIGNED
以及从java.math.BigInteger
切换到Long
修复它。
但也许还有其他方法?
非常感谢。
不得不修改 spring-jdbc 和 mariadb-java-client 来解决这个问题。