`
耳东成陈
  • 浏览: 15342 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

hibernate操作数据库 update的问题 session.update() hibernateTemplate.update()

阅读更多
今天遇到了一个问题,简单描述下,我在dao层使用 hibernateTemplate.update(obj);时发现数据无法更新,但也未报任何异常信息(可能项目搭的不好),几经周折,使用session.update(obj);时成功更新数据,在update之前,我先load加载了该对象,上网查得资料是session或事务问题, 解决方式是使用 hibernateTemplate.merge(obj);成万全之策。
一下资料来自 http://hi.baidu.com/anypcao/item/6c73e10a21c72bce75cd3c7c

(无抄袭之意,只为保存参考学习)
session.update()主要对detached object有点作用。

1。对于persistent obj
session.beginTransaction();
Employee employee = session.load(Employee.class, new Integer(12));
session.setAge((byte)63);
session.update(employee); //employee 是一个persistent obj
   System.out.println("test flag");
tx.commit();
这段程序如果把net.sf.hibernate.impl.SessionImpl的log4j.logger打开,可以看到 session.update()位置处,hibernate打印一条object already associated with session,其他的什么也没干,这是因为对于persistent obj, hibernate可以依赖于dirtyChecking机制来更新对象。

2。对于transient obj
session.beginTransaction();
Employee employee = new Employee();
session.setAge((byte)63);
session.update(employee); //employee 是一个transient obj
   System.out.println("test flag");
tx.commit();
hibernate会在session.update()的时候发现是transient obj, 抛出HibernateException:The given object has a null identifier。但是如果给employee设置一个值得话employee.setId(new Integer(87)),hibernate在tx.commit()的时候发送update语句。update xxx set xxx=xxx where id=87, 由于数据库没有87的纪录,所以对数据库的状态不会有任何的影响。

3。对于detached obj
session.beginTransaction();
Employee employee = session.load(Employee.class, new Integer(12));
tx.commit();
session.close();
....
session.beginTransaction();
session.setAge((byte)63);
session.update(employee); //employee 是一个persistent obj
   System.out.println("test flag");
tx.commit();

   上面这段代码为了得到一个id为12的detached obj, 写的比较罗嗦。事实上我们如果在真正的应用中,知道某个Employee的id



下面是错误解决:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:


于是我查询了一下资料,还终于在java Tutorials and Delelopment 的网站上找到了

Exception happens when you try to use session.update, session.lock
Solution

This exceptions happens when you did load an object allready with

session.get or session.load

and you try to reattach the object with

session.update or session.lock

Do not load an object to the session when you have allready a reference to it, you want to reuse.


Exception Message

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [de.laliluna.hibernate.Concert#1]
at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:629)
at org.hibernate.event.def.AbstractReassociateEventListener.reassociate(AbstractReassociateEventListener.java:52)
at org.hibernate.event.def.DefaultLockEventListener.onLock(DefaultLockEventListener.java:59)

这个异常发生当你用session.load 或 session.get加载一个对象时 而又尝试着
session.update or session.lock 操作此对象

解决:
请不要用session加载对对象当你引用或再次使用该对象

由于我在做删除或修改数据操作时,而同时又查询,在查询中我没有关闭session 而造成 a different object with the same identifier value was already associated with the session



以下是具体内容。。额。。好多。。不用看。。具体原因不用管。总之看解决的办法。。很简单 解决办法:

    在数据访问层将public void update(User instance) {
    super.getHibernateTemplate().update(instance);
    } 的update 改成merge 就可以了。通俗吧。。易懂吧。。 public void update(User instance) {
    super.getHibernateTemplate().merge(instance);
    } 在这里记一笔。防止以后没记性。。
分享到:
评论

相关推荐

    Hibernate数据库操作实例.zip

    4. **CRUD操作**:如何使用Session的save()、saveOrUpdate()、get()、update()、delete()等方法进行数据的增删改查。 5. **查询**:理解HQL和Criteria API的用法,以及如何进行复杂查询,如分页、排序、条件筛选。 ...

    Hibernate入门示例.doc

    通过Spring的`LocalSessionFactoryBean`和`HibernateTemplate`,可以实现更方便的事务管理和数据库操作。 总结,Hibernate作为强大的ORM框架,简化了Java应用与数据库的交互,通过对象化的方式提高了代码的可读性...

    hibernate执行原生sql语句

    "hibernate执行原生sql语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。...这些方法可以帮助我们更好地控制数据库查询,并解决一些复杂的查询问题。

    hibernateTemplate的常用方法

    通过`HibernateTemplate`,开发者可以非常方便地进行数据的增删改查等基本操作,而无需关心Hibernate Session的开启、关闭及事务管理等问题。本文将详细介绍`HibernateTemplate`的一些常用方法及其应用场景。 #### ...

    用 Hibernate 和 Spring 开发持久层.zip

    通过Hibernate,开发者可以使用面向对象的编程方式来操作数据库,而无需关心底层SQL语句。Hibernate的核心功能包括实体管理、事务处理、查询服务等。 1. **实体管理**:Hibernate通过注解或XML配置文件将Java类映射...

    Spring_Spring_Hibernate_HibernateTemplate

    Hibernate是一个对象关系映射(ORM)框架,它将Java对象与数据库中的记录进行映射,使得开发者可以使用面向对象的方式操作数据库,降低了数据访问层的复杂度。Hibernate支持JPA规范,并提供了HQL(Hibernate查询...

    传智Hibernate框架资料

    Hibernate是一个强大的Java持久层框架,它提供了对象关系映射(ORM)功能,使得开发者可以使用面向对象的方式来操作数据库,避免了繁琐的SQL语句编写。在Java应用中,Hibernate极大地简化了数据库操作,使得开发更加...

    Hibernate入门(配置文件+增删改查)

    Hibernate是Java领域中一款广泛应用的关系对象映射框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据访问层的代码。在这个“Hibernate入门”教程中,我们将深入探讨Hibernate的基本概念、配置...

    Spring与Hibernate集成中的session

    - 数据操作:如`Session.save()`, `Session.get()`, `Session.update()`等。 - 提交事务:`Transaction.commit()`。 - 关闭`Session`:`Session.close()`。 5. **Spring的事务管理** - 声明式事务管理:通过`@...

    HibernateTemplate详细描述以及使用范围

    在Spring框架中,`HibernateTemplate`作为ORM(Object Relational Mapping)技术中的一个重要组件,它提供了简化Hibernate操作的方法集,使得开发人员能够更加便捷地进行数据库操作。通过使用`HibernateTemplate`,...

    Spring-hibernate结合使用全xml配置方式

    在Java企业级开发中,Spring和Hibernate是两个非常重要的框架,Spring主要负责依赖注入和管理,而Hibernate则专注于对象关系映射(ORM)和数据库操作。本教程将详细介绍如何将两者结合,通过全XML配置方式进行集成,...

    hibernate模拟hibernatetemplate

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过面向对象的方式操作数据库,极大地简化了数据库操作。本教程将深入探讨如何模拟HibernateTemplate,这是Spring框架中的一个辅助...

    hibernate basedao(泛型版本)

    - `update(T entity)`: 更新数据库中的实体,对应Hibernate的`Session.update()`。 - `delete(T entity)`: 删除指定的实体,对应Hibernate的`Session.delete()`。 - `findById(ID id)`: 根据ID查找实体,对应...

    Spring整合hibernate(2)之基于HibernateTemplate的整合

    在需要操作数据库的Service层,通过@Autowired注解注入HibernateTemplate实例。 ```java @Autowired private HibernateTemplate hibernateTemplate; ``` 2. 常见操作 现在可以通过HibernateTemplate进行数据库操作...

    Hibernate 笔记

    Hibernate 是一个开源的 Java 平台上的对象关系映射(ORM)框架,它简化了数据库操作,使开发者能够用面向对象的方式处理数据。本笔记将深入探讨 Hibernate 的核心概念、配置、使用方法以及在实际项目中的应用。 ##...

    hibernate培训讲座

    2. **HibernateTemplate**:Spring为Hibernate提供的模板类,用于简化Hibernate操作,自动处理事务。 3. **Hibernate SessionFactory和SessionFactoryBean**:Spring通过SessionFactoryBean管理SessionFactory的生命...

    hibernate入门必看

    - **Session**: 会话接口,是操作数据库的主要接口,负责执行查询、更新等操作,并提供事务管理功能。 - **Transaction**: 事务接口,处理数据的原子性,确保数据一致性。 - **Query/Criteria**: 提供查询数据库的...

    HibernateDAO的写法

    HibernateDAO(Data Access Object)主要负责数据库的读写操作,它封装了对Hibernate Session的操作,降低了业务层与数据库的直接交互,提高了代码的可维护性和可测试性。DAO设计模式是将数据库操作隔离出来,使得...

    hibernate session生命周期示例

    在Java的持久化框架中,Hibernate是一个非常重要的存在,它为开发者提供了强大的对象关系映射(ORM)功能,简化了数据库操作。本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个...

    Hibernate资源

    Hibernate是Java领域中一款著名的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库编程。在这个“Hibernate资源”中,我们将深入探讨Hibernate的基础使用和如何与MySQL...

Global site tag (gtag.js) - Google Analytics