同事总结的hibernate意料外更新数据酷问题。
致action开发人员:
由于前些日子发现,从数据库中取出的Bean,被修改后,其修改的结果会重新反映到数据库中,提出下面分析和解决方法。
原因:
正常情况下,Service结束后,事务也就结束了。这个时候Hibernate Session就应该消失,但是,由于数据提供延迟加载
的技术支持,所以需要在Web层提供Session,用于对数据进行加载,这个时候就需要对Session的生命周期进行延长。Spring
提供了OpenSessionInViewFilter类,当一个web请求进入的时候,该请求就被分配了一个Hibernate Session到该请求的线程
上,直到该请求结束,这个时候我们通过Manager从数据库中检索一条信息到Controller层,无论在Controller层如何修改,
都不会同步到数据库中的,因为默认Session的刷新方式是AUTO(重新检索数据,提交事务,刷新数据会激活数据同步功能),
但是,通常情况下,我们对在修改后,又使用其他Manager方法对同一个Session进行了激活,使得激活了Session中的刷新事件,
这样的后果就是Hibernate把已经修改的数据作为合法的脏数据进行提交了。使得数据库中的值进行了修改。也就是说数据库
中的数据被修改了。是因为大家在同一个请求中使用了多次manager中的方法,其在最后一次使用manager方法之前,Bean中的
数据Bean进行了修改。
解决方法:
由于该Bean在hiberante中管理,如果瞬时化,会导致hiberante缓存中没有该数据,会重数据库中再次检索,这样即使我们
修改了也无济于事,所以现在提出一下解决方法。
YHB.DISABLE_SYNC(YHB中的一个常量),标记一个对象禁止与数据库中的对象同步。
当我们重数据库中检索一条信息,处于某种原因对该对象中的数据进行了修改,又不想同步到数据库中,请执行该对象的
Bean.setVersion(YHB.DISABLE_SYNC),就可以禁止该对象对数据库的修改,该方式只对自动提交更新有用,手动调用update方式无效,
后台使用该方式后还执意调用update对象,会导致版本不同步异常发生。该方式作用的对象只对不想更新的Sesstion中持久化对象
有作用,请大家确认是否必要使用。
例:
UkeMember member = manager.findById(1); // 获取一个会员
Integer version = member.getVersion(); // 暂存会员对象的版本号,
// 如果是前台没有版本号的概念,可以忽略
member.setVersion(YHB.DISABLE_SYNC); // 禁止该对象内容与数据库对象同步
member.setName("hello"); // 修改该对象中的内容
promotionRuleMng.initPromotionRules(member); // session再次激活,该对象存活去session中。
// 数据被同步到数据库中就是它照成的。
member.setVersion(version); // 还原原来的版本号
Assert.assertTrue("liutie".equals(name)); // 验证或者返回
以上功能已经实现,请大家注意更新。
相关推荐
Hibernate与JDBC对于数据库的性能操作对比事例,配置,更多信息资源
### Hibernate根据字段生成数据库表 #### 一、概述 在软件开发过程中,特别是在进行多数据库支持的应用程序开发时,我们经常需要将同一套代码部署到不同的数据库系统上。这种情况下,手动为每个数据库创建相同的表...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过Java对象来操作数据库,极大地简化了数据库操作。金仓数据库,又称为Kingbase,是一款国产的高性能、高可靠性的关系型数据库管理...
Hibernate 配置各种数据库 Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等...
通过这些映射文件,Hibernate能够自动创建或更新数据库结构,使得模型与数据库保持同步。 二、Hibernate生成数据库步骤 1. 创建实体类:首先,你需要定义Java实体类,这些类代表了数据库中的表。每个类对应一个...
总结来说,这个压缩包提供了关于如何使用Hibernate和其hbm2ddl工具创建数据库表结构的完整教程。开发者可以通过阅读和实践这些文档,了解如何配置Hibernate,使其根据Java对象模型自动创建数据库,以及如何处理对象...
北大青鸟ACCP6.0Hibernate影院信息查询系统数据库
在探讨Hibernate中所有数据库方言之前,我们先简要回顾一下Hibernate框架本身。Hibernate是一个开源的对象关系映射(ORM)框架,用于Java应用与各种关系型数据库进行交互。它提供了强大的功能,如对象持久化、查询...
总结起来,`Hibernate`结合`Proxool`可以实现对数据库的自动重新连接,有效处理连接中断的情况。通过合理的配置,我们可以优化连接池的性能,提高系统整体的健壮性和效率。在实际开发中,务必根据项目的规模和特性来...
Hibernate是一款强大的Java持久化框架,它允许开发者将Java对象映射到关系数据库中,从而简化了数据库操作。本文将深入探讨Hibernate如何自动生成数据库文件,以及相关知识点。 首先,Hibernate的核心概念是对象...
未来 Hibernate是一个强大的Java持久化框架...以上各点提供了实现这一目标的基础,但实际项目中可能还需要解决更多特定于数据库的问题。通过良好的设计和测试,可以确保Hibernate应用程序在多种数据库环境下稳定运行。
hibernate映射的创建数据库连接时的配置。教你怎么写那个配置。
JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。 在本压缩包中,我们找到了用于集成Hibernate的jar包,Hibernate是一...
接着,`SchemaExport`类是Hibernate提供的工具类,用于处理数据库的创建、更新和验证。在这段代码中,`new SchemaExport(config)`创建了一个`SchemaExport`对象,`config`参数传递了数据库配置信息。`schemaExport....
在Hibernate项目中,我们可以使用JUnit测试数据的插入、更新、查询和删除操作,确保数据库操作的正确性。 8. **自定义测试类**: 自定义测试类通常是为了模拟特定场景或功能的测试,可能包含更复杂的数据状态设置和...
总结起来,使用Hibernate进行数据库操作主要包括配置、实体定义、映射、操作数据库、事务管理、缓存和优化等方面。通过理解并熟练掌握这些步骤,开发者可以更高效地在Java应用中实现数据库操作。
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过Java对象来操作数据库,而无需编写大量的SQL语句。当使用Hibernate与Microsoft Access数据库交互时,由于Access数据库的特性和...
总结来说,Eclipse Hibernate Synchronizer插件是一个强大的工具,它增强了Eclipse IDE的数据库管理和ORM功能。通过自动同步数据库和Java实体类,它极大地提高了开发效率,减少了错误,并促进了更敏捷的开发流程。...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它简化了与数据库交互的过程,使得开发者可以使用面向对象的方式来操作数据库。对于Oracle数据库的支持,Hibernate提供了专门的驱动和配置,使得...
总结来说,"hibernate动态数据库进化版"是关于如何利用Hibernate的灵活性,结合Java的动态能力,以适应多变的数据库环境和业务需求。这需要开发者深入理解Hibernate的内部工作机制,并具备一定的数据库设计和管理...