使用mybatis打破BIGINT UNSIGNED自动增量

时间:2018-06-12 09:35:48

标签: java mysql mybatis auto-increment biginteger

所以我有:

  • 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);
    
  • 调用mapper insert方法,如:

    commandMapper.insert(entity);
    

所有这一切都可以正常工作,直到成功插入一定数量的行。在子表中插入行时,我突然收到以下错误:

    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修复了此问题。

但可能有另一种方式?

非常感谢。

1 个答案:

答案 0 :(得分:0)

不得不碰撞spring-jdbc和mariadb-java-client来解决这个问题。