hibernate 错误整理

r囧r小猫 2022-04-16 05:40 330阅读 0赞

1

2018-09-08 11:35:14

表单中

传数据到后台变成了id=””
saveOrUpdate(entity); 报错
打印出的sql
Hibernate:
update set where ID=?
错误信息
java.lang.RuntimeException: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:81)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:73)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:57)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3013)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2915)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3244)
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:113)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:276)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1127)
解决
save(entity)

看sql就知道 因为id为空,所以是应该保存数据,但是空字符串不是null

所以 saveOrUpdate(entity) 会找id为“”的行进行更新,当然找不到,报错呀

对于这类问题不应该首先判断一下id吗 或者直接调用save(entity)

2

2018-09-08 16:51:26
九月 08, 2018 4:53:08 下午 org.apache.tomcat.util.modeler.BaseModelMBean invoke
严重: Exception invoking method createStandardContext
java.lang.NullPointerException
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:633)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:565)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

原因
找不到model实体类的get set方法

3 org.hibernate.exception.GenericJDBCException: 无效的列类型

/org/springframework/spring-jdbc/3.1.1.RELEASE/spring-jdbc-3.1.1.RELEASE-sources.jar!/org/springframework/jdbc/core/JdbcTemplate.java
调用它下面的这个方法报错

  1. public int update(String sql, Object... args) throws DataAccessException {
  2. return update(sql, newArgPreparedStatementSetter(args));
  3. }

“无效的列索引”其实是个低级的错误,原因无非几个:
1、sql串的?号数目和提供的变量数目不一致:
例如:jdbcTemplate.update(sql, new Object[] {newState,oldState});
如果sql里面有1个?号,Object[]送了2个,就会报错。
2、sql串里的?号书写不正确
英文?和中文?有时难以区分。
3、sql串的?号用’’括了起来。
例如:sql=”UPDATE abc SET abc.name=’?’ WHERE abc.id=’?’”;
把’’去掉就可以了。
4,遇到这种情况select*from user where info like %?%;
虽然这是sql的写法,但是在jdbc 中需要改成 select*from user where info like ?;
如ps.setString(“%”+value+“%”);

JdbcTemplate中的这个方法
public int update(String sql, Object… args) throws DataAccessException {
return update(sql, newArgPreparedStatementSetter(args));
}
因为sql中?出也可以为null
所以会把null赋值给这条sql,但sql中却没有占位符,所以会报错

发表评论

表情:
评论列表 (有 0 条评论,330人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Hibernate 关系映射整理

    一、概念: 关系:名词,事物之间相互作用、相互联系的状态。 关联:名词:表示对象(数据库表)之间的关系;动词:将对象(数据库表)之间通过某种方式联系起来。 映射

    相关 Hibernate整理

    Hibernate是一个开放源代码的 对象关系映射 框架(orm), 它对JDBC进行了非常轻量级的对象封装,它将 POJO 与 数据库表建立映射关系, 是一个全自动的 orm