`

一个怪异的hibernate保存实体失败问题

阅读更多

以前没有遇到过,因为以前没有用spring。

下面service层代码:

java 代码
  1. public boolean updateOrderBill(Long id) {   
  2.         OrderBill ob = this.getOrderBillDao().getOrderBill(id);   
  3.         ob.setName(ob.Name()+"1");   
  4.         getOrderBillDao().saveOrderBill(ob);   
  5.         return true;   
  6.     }  

junit测试代码:

java 代码
  1. @Test  
  2.     public void testReservFailed(){   
  3.         orderBillService.updateOrderBill(Long.valueOf(12530));   
  4.         OrderBill ob = orderBillService.getOrderBill(Long.valueOf(12530));   
  5.         System.out.println(ob.getName());   
  6.     }  

执行时:根本没有保存进行,并且也没有在控制台看到:update语句

service代码改写成:

java 代码
  1. public boolean updateOrderBill(Long id) {   
  2.         OrderBill ob = this.getOrderBillDao().getOrderBill(id);   
  3.         ob.setHotelName(ob.getName()+"1");   
  4.         getOrderBillDao().excuteUpdate("update OrderBill as obj set obj.name='"+ob.getName()+"1"+"' where obj.orderBillId="+id);   
  5.         return false;   
  6.     }  

就更新成功了。

很奇怪,难道不去判断对象被弄脏了吗?

注意用的版本是:hibernate 3.2.5ga ,spring2.0.6

分享到:
评论
10 楼 clh8801 2008-01-23  
每次更新操作后都执行一下hibernate提供的flush()方法
9 楼 valibo 2007-10-29  
我也觉得是 hbm文件 和POJO类 有问题 你检查一下这里喽。。。
8 楼 sys53 2007-10-28  
其实我上面只是举了一例子,用String可能不存在,主要是因为Character引起的.
在hibernate的CharacterType里执行下面这个函数报空指针异常,而真正报的时oracle驱动内部的异常.
public void set(PreparedStatement st, Object value, int index) throws SQLException {
		st.setString( index, (value).toString() );
	}

这里,value值是'7'时指这个空指针,还是直接new新对象保存时,没有出错,从数据库获取对象后,部份字段弄脏以后save就这个错误,难道真是oracle驱动问题,用了classes12.jar和classes14.jar都是同样的错误.
7 楼 抛出异常的爱 2007-10-25  
用hsqldb作为测试库。一重启所有的重新来过。
6 楼 打倒小日本 2007-10-25  
测试用例继承了Spring提供的AbstractTransactionalDataSourceSpringContextTests基类了吧?
每次更新操作后都执行一下hibernate提供的flush()方法就可以了
否则hibernate会耍滑头不将更新提交到数据库(也许是为了效率)
5 楼 ddh9504 2007-10-24  
Fly_m 写道
hibernate没有被spring进行事务管理吧.导致commit()这个方法没有被执行,不知道是不是这样?小弟只是猜测一下而已.


问题解决了吗?对于这个问题我建议你先去看看配置文件,然后再看看那个DAO的SAVE方法,这样估记能找一解题的思路,谢谢
4 楼 avaj 2007-10-23  
我遇到过,跟你的情况一摸一样,不过原因正像 Fly_m 说的那样,事务没有提交。
3 楼 sys53 2007-10-23  
经过多次测试,这个bug确实存在,如在eclipse调式下,我在Expressions中手增加了ob.getName();注意在保存之前进行这样的操作,然后在查看相就的ob实体变量,估在hibernate代理变量中的target中的相应name变量为更新,如果我有新的成员变量name1,没有像上面的操作,name1仍然是原值,根本没有弄脏.

不知道有没有人遇到过相关问题?
2 楼 sys53 2007-09-04  
事务已经管理起来了,事实上上面的代码是可执行的,但在web应用下同样的代码不能执行,还在找原因
1 楼 Fly_m 2007-09-03  
hibernate没有被spring进行事务管理吧.导致commit()这个方法没有被执行,不知道是不是这样?小弟只是猜测一下而已.

相关推荐

    hibernate保存不到数据1

    标题中的"hibernate保存不到数据1"是一个关于Hibernate框架在尝试保存数据到数据库时遇到问题的场景。描述提到了一个具体的解决方案,即通过在`hibernate.cfg.xml`配置文件中设置`connection.autocommit`属性为`true...

    hibernate操纵实体对象

    `HibernateSessionFactory.java`以及`BatchUpdateTest.java`这四个文件涵盖了Hibernate中的核心操作和测试场景,它们一起构成了一个完整的数据库操作示例,展示了如何高效地使用Hibernate处理Java实体对象。...

    一个hibernate的小程序

    总结,这个“一个hibernate的小程序”涵盖了Hibernate的基本使用,包括配置、实体映射、数据操作、查询语言HQL以及事务管理,是学习和理解Hibernate的绝佳起点。通过深入研究这个小程序,初学者可以快速掌握...

    Hibernate version 乐观锁 (xml方式)

    在Hibernate中,通常通过在实体类中添加一个version属性来实现版本控制。当多个事务同时尝试更新同一数据时,只有版本号与数据库中的版本号一致的事务才能成功更新,否则会被视为冲突并回滚。 接下来,我们将在XML...

    Java+Persistence+with+Hibernate

    1. 实体(Entity):在Hibernate中,实体对应数据库中的表,通常是一个Java类。 2. 主键(Primary Key):每个实体都有一个主键,它是表中的唯一标识符。 3. Session:Hibernate的核心接口,负责对象的创建、读取、...

    Hibernate映射导致的几个异常

    如果在保存一个对象时,该对象引用了一个未保存的瞬态对象,Hibernate会尝试同时保存这两个对象,但在这个过程中,若主对象保存成功而从属对象失败,则会引发此异常。解决方案是在保存主对象之前,先确保所有从属...

    hibernate-orm-5.0源代码

    Unit of Work确保在一个工作单元内的所有操作都成功或全部失败,而Identity Map模式确保每个实体在内存中只有一个实例。这些机制在`Session`的实现中体现,通过一级缓存实现。 4. **查询引擎** Hibernate的查询...

    hibernate_ jpa.jar

    1. **实体(Entity)**:在Hibernate JPA中,实体是数据库表的映射,通过@Entity注解标识,每个实体类对应数据库中的一个表。 2. **实体关系(Entity Relationships)**:实体之间可以通过一对多、多对一、一对一、...

    struts和hibernate注册

    1. **创建实体类**:定义一个Java类,表示数据库中的表,使用Hibernate的注解或XML映射文件建立类与表的映射关系。 2. **配置Hibernate**:在配置文件中设置数据库连接参数,创建SessionFactory实例。 3. **创建...

    struts2+hibernate实现登录及增删改操作

    在Struts2+Hibernate的环境中,新增数据时,创建一个新的实体对象,设置属性,然后通过Hibernate的Session保存到数据库;删除操作通常是根据ID查找对象,调用Session的delete方法;更新数据则是先查询出对象,修改...

    BONC_Hibernate

    - **第一部分**:介绍了如何创建第一个Hibernate应用程序,包括设置环境、编写实体类、创建映射文件等步骤。 - **设置**:配置Hibernate所需的环境和依赖库。 - **第一个class**:创建一个简单的Java类作为持久化...

    使用hibernate做的一个登录的小实例,代码大部分都是自动生成

    - 在本实例中,可能包含一个名为`User`的实体类,代表数据库中的用户表,使用`@Entity`注解标识为Hibernate实体。 - 使用`@Id`注解指定主键字段,如`@GeneratedValue`用于自动分配主键值。 3. **映射文件...

    hibernate annotation 中文文档

    在创建一个使用 Hibernate 注解的项目之前,需要满足一定的系统环境需求,例如支持 Java 的开发环境、JDK 版本、支持 Hibernate 的应用服务器等。 ##### 1.2 系统配置 为了使 Hibernate 正常运行,还需要进行相应的...

    hibernate hellowrold入门级代码

    总结来说,"hibernate helloworld入门级代码"是一个基础的教程,涵盖了Hibernate的基本元素:配置、实体、映射、Session、Transaction和查询。通过这个示例,学习者可以了解Hibernate如何简化Java应用与数据库之间的...

    使用Hibernate开发租房系统78.

    在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者能够更加专注于业务逻辑,而不是底层的数据存取细节。本教程“使用Hibernate开发租房系统78”聚焦于利用Hibernate来构建一个...

    hello hibernate

    通过以上步骤,我们可以成功地搭建起一个基于Struts2+Hibernate的开发环境,并实现基本的数据库操作功能。对于初学者来说,掌握这些基础知识是非常重要的,它们不仅能够帮助快速上手Hibernate,也为后续更复杂的项目...

    Struts+Hibernate+Ajax注册示例

    5. Action返回一个响应,可能是成功或失败信息,以及任何必要的数据,如错误消息。 6. 前端JavaScript接收到响应,更新页面状态,如显示注册成功的提示或者错误信息。 为了实现这个示例,你需要了解Struts的配置、...

    hibernate-release-5.2.16.Final + slf4j

    Hibernate是一个开放源代码的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来处理数据库操作。在5.2.16.Final版本中,Hibernate提供了一套完整的解决方案,包括实体管理、查询语言、缓存策略以及事务...

    Hibernate登陆例子

    在Java Web开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使开发者可以更专注于业务逻辑而不是底层SQL查询。本示例将详细介绍如何使用Hibernate实现一个登录功能,适用于初学者...

Global site tag (gtag.js) - Google Analytics