读书人

关于Hibernate动态更新有关问题

发布时间: 2012-08-28 12:37:01 作者: rapoo

关于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 blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.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对象中为空默认为不更新。

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

读书人网 >软件架构设计

热点推荐