`
cuixuelei
  • 浏览: 51360 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Hibernate数据库查询出现的错误

阅读更多

错误:org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [com.blt.myoa.po.oaattendance.TbPersonnelInfo#12]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.blt.myoa.po.oaattendance.TbPersonnelInfo#12]

大体意思:两个session在同时操作一个Object.

出现的原因是:查询了一下对象,紧接着对该对象进行修改(update),结果出错了。

解决方法: hibernate后台update 换成 merge

 

下面是摘自javaeye上的文章:

今天做了个测试,写了个测试用例来看看merge与update时控制台打印出来的日志有什么不一样。实体bean很简单,就id和name两个字段,接下来分别给出以下几种测试情形的控制台日志内容:

1. 数据库记录已存在,更改person的name为一个新的name。

merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
Hibernate: update person set name=? where id=?

update方法打印出的日志如下:
Hibernate: update person set name=? where id=?

2. 数据库记录已存在,更改person的name和数据库里对应id记录的name一样的值。

merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
此处相对于第一种情形少了update的动作

update方法打印出的日志如下:
Hibernate: update person set name=? where id=?

3. 数据库记录不存在时,也就是你传的实体bean的ID在数据库没有对应的记录。

merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (name) values (?)
如果没有对应的记录,merge会把该记录当作新的记录来插入。此处我很疑惑,因为我传得person实体对象里写明了id值的,它为什么还会做插入的动作呢?

update方法打印出的日志如下:
Hibernate: update person set name=? where id=?
2009-11-22 20:59:55,359 ERROR [org.hibernate.jdbc.AbstractBatcher] - Exception executing batch:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

以下的内容摘抄自网上:
  当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态。
  但当我们使用merge的时候,执行完成,我们提供的对象A还是脱管状态,hibernate或者new了一个B,或者检索到 一个持久对象B,并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态。

分享到:
评论

相关推荐

    Hibernate数据库事务

    ### Hibernate数据库事务详解 #### 一、概述 Hibernate 是一款流行的 ORM(对象关系映射)框架,它使得 Java 开发者能够更容易地操作数据库。在使用 Hibernate 进行数据库操作时,事务管理是非常重要的一部分。...

    Hibernate操作数据库的步骤

    Hibernate是一款强大的Java持久化框架,它简化了与关系型数据库如SQL Server的交互。通过将对象映射到数据库表,Hibernate使得开发人员可以专注于业务逻辑,而无需关注底层的SQL语句。以下是对"Hibernate操作数据库...

    java hibernate 数据库 类型对比

    例如,根据数据的实际需求选择合适的类型可以节省存储空间,避免因类型不匹配导致的转换错误,同时也能提高查询效率。在实际开发中,还需要考虑数据库系统的特性,因为不同的数据库系统可能会有不同的类型实现和限制...

    hibernate同时配置多个数据库连接

    - **错误处理**:在多数据库配置中,务必注意异常处理,防止因一个数据库连接问题影响到其他数据库的操作。 - **设计模式**:考虑使用工厂模式或策略模式来管理和创建`SessionFactory`,以便在代码中更灵活地切换...

    Hibernate的查询方式

    Hibernate作为Java领域中最流行的ORM(Object-Relational Mapping)框架之一,提供了一系列高效、灵活的查询机制,旨在桥接对象模型与关系数据库之间的鸿沟。本文将深入探讨Hibernate的查询方式,特别聚焦于HQL...

    自己动手模仿Hibernate写数据库框架

    【标题】"自己动手模仿Hibernate写数据库框架"揭示了本次讨论的核心内容——尝试构建一个类似于Hibernate的数据库操作框架。Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库与Java对象之间的...

    hibernate根据字段生成数据库表

    Hibernate 提供了一个非常实用的功能——基于实体类自动生成数据库表,这不仅能够显著提高开发效率,还能减少人为错误。本文将详细介绍如何利用 Hibernate 的 `SchemaExport` 类实现这一功能。 #### 二、准备工作 ...

    hibernate配置数据库连接池的三种方法

    数据库连接池是应用程序管理和维护数据库...总的来说,合理配置和使用数据库连接池是优化Hibernate应用性能的关键步骤之一,它有助于提升系统整体的运行效率,减少资源浪费,同时也便于监控和管理数据库连接的状态。

    HIbernate免注解实现操作数据库 及Hibernate3连接SQL的BUG解决办法

    4. **实体状态异常**: Hibernate在操作实体时会根据其生命周期状态进行处理,如果出现“ detached entity passed to persist”之类的错误,可能是因为实体状态管理不当。确保在操作实体前正确处理其状态(如merge、...

    springMVC+hibernate数据库增删改查完整列子(包括所有的jar包)

    通过 @Valid 注解和 Hibernate Validator,SpringMVC 可以在控制器方法调用前进行数据验证,提供友好的错误提示。 **8. AOP 面向切面编程** SpringMVC 结合 Spring 的 AOP 功能,可以方便地实现如日志记录、事务...

    Spring hibernate SpringMVC整合对数据库操作

    Hibernate是一款优秀的ORM框架,能够连接并操作数据库,包括保存和修改数据。Spring MVC是Java的web框架,能够将Hibernate集成进去,完成数据的CRUD。Hibernate使用方便,配置响应的XML文件即可。由于spring3.x,基于...

    SpringStruct2Hibernate以及数据库使用的包

    它支持多种数据库,提供了缓存机制,增强了性能,并且具有丰富的查询语言HQL(Hibernate Query Language)。 当Spring、Struts2和Hibernate结合在一起时,可以形成一个强大的开发环境。Spring作为整体的协调者,...

    hibernate查询代码

    **正文** Hibernate是一款强大的Java持久化框架,它简化了数据库...了解并熟练掌握这些查询技术,将极大地提高开发效率,减少与数据库交互中的错误。希望这篇文章能帮助你更好地理解和使用Hibernate进行数据库查询。

    Hibernate的高级查询

    当我们需要进行更复杂的数据库查询时,Hibernate提供了丰富的高级查询功能,这正是“Hibernate的高级查询”这一主题的核心所在。 在Hibernate中,高级查询主要包括HQL(Hibernate Query Language)、Criteria API和...

    Hibernate几个常见错误解决方式

    在使用Hibernate进行数据库操作时,可能会遇到各种错误。这些错误通常是由于配置问题、SQL语法错误、类型不匹配或实体属性与数据库映射不一致导致的。以下是对标题和描述中提及的一些常见错误及其解决方法的详细说明...

    Hibernate配置常见错误

    总结,Hibernate配置错误主要集中在SessionFactory创建、实体类配置、数据库连接、属性映射、懒加载、HQL查询和事务管理等方面。解决这些问题需要对Hibernate的工作原理有深入理解,并熟练掌握其配置细节。通过以上...

    hibernate 连接数据库基础源码2

    如果出现错误,可以使用`rollback()`回滚事务。 7. **关闭资源**: 最后,关闭Session和SessionFactory,释放数据库连接。 ### 示例源码 在`day1`目录中,可能包含了以下关键代码片段: ```java // 创建...

    达梦 Hibernate 方言 2.0 至 4.0

    4. **性能优化**:方言优化了SQL的生成,减少了不必要的数据库访问,提升了查询速度和整体应用性能。 5. **新功能支持**:随着Hibernate的进化,新版本的方言也会引入对如批处理操作、存储过程调用等新功能的支持,...

    Eclipse Hibernate Synchronizer插件操作数据库

    Eclipse Hibernate ...通过自动同步数据库和Java实体类,它极大地提高了开发效率,减少了错误,并促进了更敏捷的开发流程。对于使用Hibernate进行数据库操作的Java开发者来说,这是一个不可或缺的辅助工具。

    Hibernate通用数据库操作方法

    Hibernate 是一个流行的对象关系映射(ORM)框架,它允许开发者使用 Java 对象来操作数据库,而无需直接编写 SQL 查询。在上述代码中,我们看到了四个核心的 Hibernate 操作:插入(insert)、删除(delete)、更新...

Global site tag (gtag.js) - Google Analytics