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