关于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对象中为空默认为不更新。

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

相关推荐