Hibernate中更新非空域;传入一个对象,这个对象中有的域可能是null,但是我并不想覆盖原来的数据库中的有值的域。

我的实现方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class BeanUtil {
/**
* 复制src对象的非空属性值到target中
* @param src
* @param target
*/
public static void copyNonNullProperties(Object src, Object target) {
BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
}

/**
* 获取对象中属性为空的属性
* @param source
* @return
*/
public static String[] getNullPropertyNames (Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
PropertyDescriptor[] pds = src.getPropertyDescriptors();

Set<String> emptyNames = new HashSet<>();
for(PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) emptyNames.add(pd.getName());
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
}

如何调用:

1
2
3
4
5
6
实体类1:src (前端传来的数据)
实体类1:existing (通过前端传来数据的id获取得到数据库表里的数据)
//用src中不为空的属性替换existing中对应的属性
copyNonNullProperties(src,existing);
//调用hibernate的关系更新方法
iModelConfigDAO.update(existing);

iModelConfigDAO的实现类说明:

1
2
3
4
5
6
7
8
9
10
11
12
public class ModelConfigDAOImpl implements IModelConfigDAO{
@Resource
private SessionFactory sessionFactory;

private Session getSession() {
return sessionFactory.getCurrentSession();
}

public void update(ModelConfig modelConfig) {
this.getSession().update(modelConfig);
}
}