在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对象中为空默认为不更新。
这样解决一个问题 就是从一个对象将值拷贝到另外一个对象。