在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动态生成表结构之前,我们需要先进行基本的配置。这通常包括以下步骤: 1. 创建`hibernate.cfg.xml`配置文件:在文件中配置数据库连接信息,如URL、用户名、密码等。 2. 创建实体类:这些类代表...
6. **Maven Webapp:** 提到的"curd2 Maven Webapp"可能是指一个使用Maven构建的Web应用程序,其中包含了一个名为"curd2"的模块,这个模块可能包含了上述关于Hibernate CRUD操作和动态SQL的实现。 综上所述,这个...
在Java的持久化框架Hibernate中,动态更新是一种优化策略,用于提高数据更新的效率。当一个对象的部分属性被修改时,传统的做法是先从数据库中加载该对象的完整信息,再将新值设置到对应的属性上,最后更新整个对象...
本主题“hibernate动态映射表处理Oracle的CLOB类型”主要聚焦于如何在Hibernate中有效地管理和操作CLOB字段。在Oracle 10g中,CLOB数据类型的处理有时会遇到一些挑战,尤其是在与ORM框架结合使用时。以下将详细介绍...
【标题】:“Hibernate动态建表” 在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与Java对象模型相结合,简化了数据库编程。"Hibernate动态建表"指的是在应用运行时...
【标题】与【描述】提及的是“Hibernate面试题专栏”,主要涵盖了全面的Hibernate面试题、笔试题以及相关问题,这表明我们将要讨论的是Java领域中著名的对象关系映射框架——Hibernate的相关知识。Hibernate是一个...
深入QBC查询.md可能涵盖了Hibernate的Query By Criteria API,这是另一种查询数据库的方式,除了传统的HQL(Hibernate Query Language)外,开发者可以通过构建Criteria对象来执行动态查询,这种方式更接近面向对象...
在本实例中,Hibernate可能被用来管理数据模型,包括对象的创建、查询和更新,以及与SQL Server数据库的交互。 项目中包含的文件: 1. `newhouse.rar`:这可能是一个完整的Web应用程序源代码,包含Struts的配置文件...
Hibernate-Extensions提供了一种自动化方式来处理这些时间戳,比如在对象更新时自动更新某个字段,无需手动设置。 五、其他功能 除了上述特性,Hibernate-Extensions还提供了其他实用功能,如批量操作支持、动态...
在本文中,我们将深入探讨如何在Java Hibernate应用中实现不同数据库之间的动态切换。 首先,我们需要理解Hibernate的核心配置文件`hibernate.cfg.xml`。在这个文件中,通常会指定数据库连接的信息,如URL、用户名...
为了解决这一问题,两个工具——hibernate-extensions和Middlegen-Hibernate应运而生,它们可以自动生成这些代码,提高了开发效率。 **hibernate-extensions** 是Hibernate框架的一个扩展,它提供了一些额外的功能...
4. **Criteria查询**:除了SQL和HQL(Hibernate查询语言),Hibernate还提供了`Criteria` API进行动态查询。开发者可以通过`Criteria`对象构建查询条件,无需编写字符串查询,提高了代码的可读性和可维护性。 5. **...
《Hibernate实战》是一部备受赞誉的关于Hibernate框架的专业书籍,被广泛认为是最权威的Hibernate著作之一。该书由Hibernate项目的核心开发者撰写,因此能够提供深入且独特的见解。在出版之初便获得了包括Java ...
《深入剖析Hibernate 3.2源代码...通过深入学习Hibernate 3.2的源代码,开发者不仅可以了解其实现原理,还能在遇到问题时更快定位,进行定制化开发。同时,这也有助于理解ORM框架的工作方式,提升软件设计和开发能力。
这一版本的更新使得Hibernate更加易于使用,同时也提高了代码的可读性和可维护性。 二、Hibernate注解基础 1. 实体类注解:`@Entity` `@Entity`注解用于标记一个Java类为数据库中的实体表,每个实例对应表中的一条...
Criteria API则提供了一个程序化的查询方式,可以在运行时动态构建查询。 这个"Hibernate框架jia包"包含的jar文件可能包括Hibernate的核心库、数据库驱动、缓存插件等,确保你在开发过程中能全面支持Hibernate的...
7. ** Criteria API**:除了HQL,Hibernate还提供了Criteria API,这是一种更动态的查询方式,可以在运行时构建查询条件。 8. **级联操作**:通过在实体类的属性上设置级联注解,可以控制一个对象的保存、删除等...
5. **Criteria查询**:Hibernate提供了Criteria API,一种更面向对象的查询方式,允许开发者动态构建查询,无需编写SQL语句。 6. **HQL(Hibernate Query Language)**:类似于SQL,但专为ORM设计,HQL允许开发者以...
`Hibernate 基础1.ppt`可能涵盖Hibernate的基本用法,如实体类的定义、属性注解、一对一、一对多、多对多的关联映射,以及如何通过Hibernate API进行CRUD操作(创建、读取、更新、删除)。此外,还可能介绍到HQL...
注意,不应使用final修饰类,因为这将影响Hibernate的动态代理机制。 2. 持久对象标识OID Hibernate通过对象标识(OID)来区分不同的持久化对象,它相当于数据库中的主键,使得对象与数据库记录一一对应。 总结:...