`
liuxianwei
  • 浏览: 4712 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

关于Hibernate动态更新问题

阅读更多

在Hibernate开发中我们会遇到这样的问题,比如有一个对象有3个字段,但是我们从页面得到2个字段修改,剩下一个字段不修改,这个时候我们就得查询出原来的对象,然后将那个不修改的字段设置到新的对象中,最后更新,这样做很费时,有时候就会有很多字段需要设置,容易出错。但是利用hibernate的dynamic-update="true" 但是有很多的限制,一旦对象脱离的session,就没有作用了。所以我利用java的反射机制,将旧对象中不变的值和新对象中的值合并。这样对于没有修改的字段,值还是原来的样子,修改以后的就变成了新的值。下面是两个对象合并的代码 其实也很简单,大家都会做的

 

public static Object merge(Object old,Object fresh){
		for(Field field:fresh.getClass().getDeclaredFields()){
			String fieldName = field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
			String setMethodName = "set" + fieldName;
			String getMethodName = "get" + fieldName;
			try {
				Method getMethod = fresh.getClass().getMethod(getMethodName);
				Object value = getMethod.invoke(fresh);
				if(value != null){
					Method setMethod = old.getClass().getMethod(setMethodName, value.getClass());
					setMethod.invoke(old,value);
				}
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return old;
	}

 

 public void dynamicUpdate(Object old,Object fresh){
    	update(merge(old, fresh));
    }

  

 public void update(Object object)
    {
    	if(object == null)
     	   return;
    	try
        {
            session = HibernateSessionFactory.getSession();
            tx = session.beginTransaction();
            session.update(object);
            tx.commit();
        }
        catch(TransactionException tex)
        {
        	 tx.rollback();
        	 tex.printStackTrace();
        }
        finally{
        	session.close();
        }
      
    }

 这样在action中只需要调用dynamicUpdate 方法,即可进行动态的更新。说明一下,object对象中为空默认为不更新。

这样解决一个问题 就是从一个对象将值拷贝到另外一个对象。

分享到:
评论

相关推荐

    hibernate动态生成表结构

    在使用Hibernate动态生成表结构之前,我们需要先进行基本的配置。这通常包括以下步骤: 1. 创建`hibernate.cfg.xml`配置文件:在文件中配置数据库连接信息,如URL、用户名、密码等。 2. 创建实体类:这些类代表...

    hibernate增删改查和动态sql

    6. **Maven Webapp:** 提到的"curd2 Maven Webapp"可能是指一个使用Maven构建的Web应用程序,其中包含了一个名为"curd2"的模块,这个模块可能包含了上述关于Hibernate CRUD操作和动态SQL的实现。 综上所述,这个...

    hibernate动态更新

    在Java的持久化框架Hibernate中,动态更新是一种优化策略,用于提高数据更新的效率。当一个对象的部分属性被修改时,传统的做法是先从数据库中加载该对象的完整信息,再将新值设置到对应的属性上,最后更新整个对象...

    hibernate动态映射表处理oracle的clob类型

    本主题“hibernate动态映射表处理Oracle的CLOB类型”主要聚焦于如何在Hibernate中有效地管理和操作CLOB字段。在Oracle 10g中,CLOB数据类型的处理有时会遇到一些挑战,尤其是在与ORM框架结合使用时。以下将详细介绍...

    Hibernate动态建表

    【标题】:“Hibernate动态建表” 在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与Java对象模型相结合,简化了数据库编程。"Hibernate动态建表"指的是在应用运行时...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    【标题】与【描述】提及的是“Hibernate面试题专栏”,主要涵盖了全面的Hibernate面试题、笔试题以及相关问题,这表明我们将要讨论的是Java领域中著名的对象关系映射框架——Hibernate的相关知识。Hibernate是一个...

    Hibernate 简单 PPT 总结

    深入QBC查询.md可能涵盖了Hibernate的Query By Criteria API,这是另一种查询数据库的方式,除了传统的HQL(Hibernate Query Language)外,开发者可以通过构建Criteria对象来执行动态查询,这种方式更接近面向对象...

    struts +hibernate 动态action 的以个网站实列 包含数据库

    在本实例中,Hibernate可能被用来管理数据模型,包括对象的创建、查询和更新,以及与SQL Server数据库的交互。 项目中包含的文件: 1. `newhouse.rar`:这可能是一个完整的Web应用程序源代码,包含Struts的配置文件...

    Hibernate-extensions 完整安装包

    Hibernate-Extensions提供了一种自动化方式来处理这些时间戳,比如在对象更新时自动更新某个字段,无需手动设置。 五、其他功能 除了上述特性,Hibernate-Extensions还提供了其他实用功能,如批量操作支持、动态...

    java hibernate不同数据库之间的动态切换

    在本文中,我们将深入探讨如何在Java Hibernate应用中实现不同数据库之间的动态切换。 首先,我们需要理解Hibernate的核心配置文件`hibernate.cfg.xml`。在这个文件中,通常会指定数据库连接的信息,如URL、用户名...

    hibernate-extensions和Middlegen-Hibernate

    为了解决这一问题,两个工具——hibernate-extensions和Middlegen-Hibernate应运而生,它们可以自动生成这些代码,提高了开发效率。 **hibernate-extensions** 是Hibernate框架的一个扩展,它提供了一些额外的功能...

    hibernate3.zip 包含hibernate3.jar

    4. **Criteria查询**:除了SQL和HQL(Hibernate查询语言),Hibernate还提供了`Criteria` API进行动态查询。开发者可以通过`Criteria`对象构建查询条件,无需编写字符串查询,提高了代码的可读性和可维护性。 5. **...

    hibernate实战 英文版

    《Hibernate实战》是一部备受赞誉的关于Hibernate框架的专业书籍,被广泛认为是最权威的Hibernate著作之一。该书由Hibernate项目的核心开发者撰写,因此能够提供深入且独特的见解。在出版之初便获得了包括Java ...

    hibernate-3.2源代码

    《深入剖析Hibernate 3.2源代码...通过深入学习Hibernate 3.2的源代码,开发者不仅可以了解其实现原理,还能在遇到问题时更快定位,进行定制化开发。同时,这也有助于理解ORM框架的工作方式,提升软件设计和开发能力。

    hibernate annotation hibernate3

    这一版本的更新使得Hibernate更加易于使用,同时也提高了代码的可读性和可维护性。 二、Hibernate注解基础 1. 实体类注解:`@Entity` `@Entity`注解用于标记一个Java类为数据库中的实体表,每个实例对应表中的一条...

    Hibernate框架jia包

    Criteria API则提供了一个程序化的查询方式,可以在运行时动态构建查询。 这个"Hibernate框架jia包"包含的jar文件可能包括Hibernate的核心库、数据库驱动、缓存插件等,确保你在开发过程中能全面支持Hibernate的...

    hibernate5.2.9

    7. ** Criteria API**:除了HQL,Hibernate还提供了Criteria API,这是一种更动态的查询方式,可以在运行时构建查询条件。 8. **级联操作**:通过在实体类的属性上设置级联注解,可以控制一个对象的保存、删除等...

    hibernate 3.6 中文 chm

    5. **Criteria查询**:Hibernate提供了Criteria API,一种更面向对象的查询方式,允许开发者动态构建查询,无需编写SQL语句。 6. **HQL(Hibernate Query Language)**:类似于SQL,但专为ORM设计,HQL允许开发者以...

    ejb+hibernate资料 ejb+hibernate资料

    `Hibernate 基础1.ppt`可能涵盖Hibernate的基本用法,如实体类的定义、属性注解、一对一、一对多、多对多的关联映射,以及如何通过Hibernate API进行CRUD操作(创建、读取、更新、删除)。此外,还可能介绍到HQL...

    hibernate权威整理文档!

    注意,不应使用final修饰类,因为这将影响Hibernate的动态代理机制。 2. 持久对象标识OID Hibernate通过对象标识(OID)来区分不同的持久化对象,它相当于数据库中的主键,使得对象与数据库记录一一对应。 总结:...

Global site tag (gtag.js) - Google Analytics