0 0

mysql写入数据,发生字段粘连问题5

 

我尽量叙事的清楚点吧,可能稍微啰嗦点。报错内容让我很头疼,我都开始怀疑mybatits 3.0.2 和mysql 5.1是不是本身就有bug了。

请大神们稍事略过下面的代码,然后我再叙述

项目使用到了spring 3  + mybatits 3.0.2 + mysql 5.1

在存储历史记录是报错。偶尔报错,感觉应该是万分之几的概率吧。

Caused by: org.springframework.dao.DuplicateKeyException: SqlSession operation; SQL []; Duplicate entry '5879889-35399' for key 'user_id'; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '5879889-35399' for key 'user_id'
	at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:241)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
	at org.mybatis.spring.SqlSessionTemplate.wrapException(SqlSessionTemplate.java:364)
	at org.mybatis.spring.SqlSessionTemplate$7$1.doInSqlSession(SqlSessionTemplate.java:344)
	at org.mybatis.spring.SqlSessionTemplate.execute(SqlSessionTemplate.java:173)
	at org.mybatis.spring.SqlSessionTemplate.execute(SqlSessionTemplate.java:155)
	at org.mybatis.spring.SqlSessionTemplate$7.invoke(SqlSessionTemplate.java:339)
	at $Proxy59.addFavorite(Unknown Source)
	at -------------------------------------.addFavorite(---------.java:104)
	at -------------------------------------$$FastClassByCGLIB$$bf29fae7.invoke(<generated>)
	at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
	at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:692)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)
	at ------------------------------------$$EnhancerByCGLIB$$1aaa1136.addFavorite(<generated>)
	at-------------------------------------.addFavorite(--------.java:277)
	... 32 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '58179889-353994' for key 'user_id'
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1039)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)
	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:989)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:22)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:51)
	at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:29)
	at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:73)
	at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:43)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:102)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:91)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:54)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:35)
	at $Proxy59.addFavorite(Unknown Source)
	at sun.reflect.GeneratedMethodAccessor926.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.mybatis.spring.SqlSessionTemplate$7$1.doInSqlSession(SqlSessionTemplate.java:342)
	... 48 more

 

   上面一堆横杆是我替换了我项目的路径或者类名

    异常中得Duplicate entry '5879889-35399' for key 'user_id'我解释一下

    5859889是用户id,35399是书籍id,我再写sql的时候,明明是写对对应的字段的。但是在写入数据库的时候就报错了。

    sql如下

 

   <insert id="addFavorite"  useGeneratedKeys="true" keyProperty="id"  >
        INSERT INTO favorites (<include refid="favorite.columns" />
         <![CDATA[
        ) VALUES (
        	#{id} ,
        	#{userId} ,
        	#{bookId} ,
        	NOW() 
        )
    ]]>
  </insert>

   业务代码如下

 

 

favorite = new Favorite();
favorite.setBookId(bookInfo.getId());
favorite.setUserId(user.getId());
FavoriteFacade.addFavorite(favorite);// 加入收藏

    对于favorite的bookId和userId我都设置的是Integer类型。

 

    不知道为什么,两个字段的内容,再写入数据库的时候,就写在了一块。中间的 - ,是咋回事啊,哪里冒出来的啊????数据库中user_id是int类型。

    项目跑了许久了。但是时不时就报着个错误。我感觉我的代码,写的没问题。所以就开始怀疑mybatits 3.0.2 和mysql 5.1是不是本身就有bug了。

    大神们,给点建议吧~~~

   

 

 

 

2014年7月15日 18:12

5个答案 按时间排序 按投票排序

0 0

采纳的答案

Duplicate entry '5879889-35399' for key 'user_id'

应该就是主键重复的问题吧

你的userId 和 bookId 是不是联合主键

2014年7月17日 12:16
0 0

很明显呀 索引 user_id(unique) 重复
你的表中有已经存在 user_id(5879889) bookid(35399)的数据了
应该在插入数据前检查数据是否已经存在

2014年7月16日 15:19
0 0

你可以在数据源上封装一层SQL日志框架,先看看MYBATIS生成的SQL对不对,你可以用这个SQL监控框架,p6spy.

2014年7月16日 13:21
0 0

你favorites 表的id字段是不是设置为auto_increment,而insert语句中又直接赋了#{id}

检查下是不是可能这个原因造成的

2014年7月16日 10:46
0 0

看了lz的问题,我也有些疑惑,经常遇到一些奇怪的问题,开始怀疑这怀疑那,后来找到问题的时候通常都是一些低级错误引起的。

你可以试试这样,
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '58179889-353994' for key 'user_id' 
这个异常应该是mysql的驱动包里的,你用Maven自动下载了源码,找到抛异常的这段代码看是否是捕获的,如果是捕获的话就去catch里打断点,如果是抛出的那外层肯定也有捕获的代码,应该能查到到当前的执行的sql

另外你的mybatis是否有自定义拦截器?如果有仔细检查拦截器的代码,特别是if语句块的代码

2014年7月16日 10:38

相关推荐

    Java实现批量向mysql写入数据的方法

    Java实现批量向mysql写入数据的方法 Java语言是目前最流行的编程语言之一,在数据库应用中,Java语言广泛应用于与数据库的交互,特别是mysql数据库。mysql数据库是目前最流行的开源关系数据库管理系统,它提供了...

    MySQL数据表添加字段

    在MySQL数据库管理中,添加字段是一项常见的操作,用于在已有的数据表中增加新的列来扩展数据表的结构。这通常发生在数据需求发生变化或者需要记录更多相关信息时。本篇文章将详细探讨如何在MySQL中添加字段,以及...

    根据mysql数据的一个字段数据修改另一个字段的数据

    要求:查询一个字段的数据,将每个数据拆分,取第一个字符,将第一个字符遍历出来,替换到另一个字段里面

    Mysql的longblob字段插入数据问题解决

    在使用mysql的过程中,有个问题就是mysql的优化,mysql中longblob字段在5.5版本中默认的为1M。 想改变这个问题,需要注意几点: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (2054817 &gt; ...

    易语言连接mysql数据库来实现读取写入修改实例

    在本实例中,我们将探讨如何使用易语言连接MySQL数据库,进行数据的读取、写入和修改操作。 首先,连接MySQL数据库是所有操作的基础。易语言提供了“数据库”类库,其中包含了一系列与数据库交互的命令。我们需要...

    mysql批量增加字段.txt

    MySQL批量对表增加指定字段,会快速实现批量字段的添加。写了2个存储存储过程,执行即可。方便快速!

    Oracle_Mysql_Sqlserver字段类型转换参考

    Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_...

    mysql查询包含某字段的所有表

    mysql查询包含某字段的所有表. 根据字段名称找出含有该字段的所有表。

    mysql历史数据同步到clickhouse 已测试

    例如,可以使用`Maxwell`或`Canal`这样的工具监听MySQL的binlog事件,当MySQL中的数据发生变化时,将变更同步到ClickHouse。这种方式需要保持MySQL的binlog格式为ROW模式,以便能解析出具体的字段变更。 - **ETL...

    mysql 数据字段导出工具 增加了注释字段导出

    在别人基础上修改了一下。 感性原作者的奉献 一起贡献都归功与原作者

    10倍以上提高Pentaho Kettle的MySQL写入速度

    标题中的“10倍以上提高Pentaho Kettle的MySQL写入速度”指的是通过优化Pentaho Kettle(也称为Kettle或PDI)的数据处理流程,显著提升了将数据导入到MySQL数据库的速度。Pentaho Kettle是一款强大的ETL(提取、转换...

    MySQL根据某一个或者多个字段查找重复数据的sql语句

    1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) &gt; 1) 2、查询出所有数据进行分组之后,和重复数据...

    解析mysql不重复字段值求和

    其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。...

    解决python写入mysql中datetime类型遇到的问题

    刚开始使用python,还不太熟练,遇到一个datetime数据类型的问题: 在mysql数据库中,有一个datetime类型的字段用于存储记录的日期时间值。python程序中有对应的一个datetime变量dt。 现在需要往mysql数据库中添加...

    python控制MySQL写入写出

    可以用python接收传感器串口数据,将数据传入本地MySQL或者云端MySQL

    mysql导出指定数据或部份数据的方法

    `,这会将`old-table`中对应的字段数据插入到`new-table`中。 3. 最后,你可以使用`mysqldump`来导出`new-table`,并根据需要进行文本处理。 **方法二:使用MySQL的SELECT INTO OUTFILE备份语句** 这种方法非常...

    利用Flume将MySQL表数据准实时抽取到HDFS、MySQL、Kafka

    而`flume-mysql-sink-1.0-SNAPSHOT.jar`可能是一个自定义的接收器,用于将数据写入MySQL。此外,Flume的配置文件`flume-conf.properties`用于设置数据流动的路径、源和接收器的属性等。 2. **MySQL**: `mysql-...

    mysql导出工具(blob字段)

    mysql导出工具,可导出无注释插入语句,表中字段有blob类数据,插入语句前还有锁表操作语句,适合多种场景

Global site tag (gtag.js) - Google Analytics