首页 > 开发 > JAVA > 正文

SimpleJdbcInsert中ID使用UUID用executeAndReturnKeyHolder方法返回主键时报错

2016-04-14 21:13:57  来源:极客头条

2016-02-27作者:程序员博客分类:Java技术阅读()

  在SimpleJdbcInsert给我们的使用带来了很大的方便,一直在小小项目中使用ID是自增的,可是突然换成UUID的时候才发现不能用了,报错信息如下:
  org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1364]; Field ‘id’ doesn’t have a default value; nested exception is java.sql.SQLException: Field ‘id’ doesn’t have a default value
  Spring的SimpleJdbcInsert发挥了Simple风格,与SimpleJdbcTemplate同属于Simple体系。该类为向数据库中插入数据提供了一个非常快捷的方式,另外它还提供了一套用于返回插入数据的主键的方法:executeAndReturnKeyHolder、executeAndReturnKey。
  查看API的时候可以看到executeAndReturnKey这个方法的返回类型是Number类型,当时我就再想如果主键的类型是String类型呢,比如UUID。后来看到还有一个executeAndReturnKeyHolder方法,返回的是一个KeyHolder对象,可以通过keyHolder#getKeys()获取主键的值,另外还有一个getKeyList()方法用于复合主键的情况,这里先撇开不说。
SimpleJdbcInsert simpleJdbcInsert=new SimpleJdbcInsert(jdbcTemplate);KeyHolder keyHolder = simpleJdbcInsert.withTableName(table())     .usingGeneratedKeyColumns(pk)     .executeAndReturnKeyHolder(map); try {   BeanUtils.setProperty(entity, pk, keyHolder.getKeys().values());      } catch (Exception e) {        e.printStackTrace();        return null;     } .executeAndReturnKeyHolder(map);此处是要求返回主键  可是我们在使用UUID的时候,已经带来ID来插入数据,所以就不需要KeyHolder返回主键了,正确写法如下
map.put(pk, UUID.randomUUID().toString());SimpleJdbcInsert simpleJdbcInsert=new SimpleJdbcInsert(jdbcTemplate);simpleJdbcInsert.withTableName(table()).execute(map);return entity;
本文地址:http://www.osblog.net/blog/667.html