大家都知道hibernate更新对象时默认会根据ID更新对象的所有属性。
而有时我们的类很多字段时,在程序员并不需要所有字段,我们只更新其中几个字段而已。
3种解决方案:1,全部更新。2,更新重要的部分,3,最小更新。
核发的对象更新辅助类:
package com.whatycms.common.hibernate3;
import java.util.HashSet;
import java.util.Set;
/**
* 更新对象类
*
* 提供三种更新模式:MAX, MIN, MIDDLE
* <ul>
* <li>MIDDLE:默认模式。除了null外,都更新。exclude和include例外。</li>
* <li>MAX:最大化更新模式。所有字段都更新(包括null)。exclude例外。</li>
* <li>MIN:最小化更新模式。所有字段都不更新。include例外。</li>
* </ul>
*
* @author liufang
*
*/
public class Updater {
protected Updater(Object bean) {
this.bean = bean;
}
/**
* 创建更新对象
*
* @param bean
* @return
*/
public static Updater create(Object bean) {
return new Updater(bean);
}
/**
* 创建更新对象
*
* @param bean
* @param mode
* @return
*/
public static Updater create(Object bean, UpdateMode mode) {
Updater updater = new Updater(bean);
updater.setUpdateMode(mode);
return updater;
}
/**
* 设置更新模式
*
* @param mode
* @return
*/
public Updater setUpdateMode(UpdateMode mode) {
this.mode = mode;
return this;
}
/**
* 必须更新的字段
*
* @param property
* @return
*/
public Updater include(String property) {
includeProperties.add(property);
return this;
}
/**
* 不更新的字段
*
* @param property
* @return
*/
public Updater exclude(String property) {
excludeProperties.add(property);
return this;
}
/**
* 某一字段是否更新
*
* @param name
* 字段名
* @param value
* 字段值。用于检查是否为NULL
* @return
*/
public boolean isUpdate(String name, Object value) {
if (this.mode == UpdateMode.MAX) {
return !excludeProperties.contains(name);
} else if (this.mode == UpdateMode.MIN) {
return includeProperties.contains(name);
} else if (this.mode == UpdateMode.MIDDLE) {
if (value != null) {
return !excludeProperties.contains(name);
} else {
return includeProperties.contains(name);
}
} else {
// never reach
}
return true;
}
private Object bean;
private Set<String> includeProperties = new HashSet<String>();
private Set<String> excludeProperties = new HashSet<String>();
private UpdateMode mode = UpdateMode.MIDDLE;
// private static final Logger log = LoggerFactory.getLogger(Updater.class);
public static enum UpdateMode {
MAX, MIN, MIDDLE
}
public Object getBean() {
return bean;
}
public Set<String> getExcludeProperties() {
return excludeProperties;
}
public Set<String> getIncludeProperties() {
return includeProperties;
}
}
view层调用:
updateByUpdater(createMemberUpdate(bean));
哪些字段必须更新,哪些字段不更新。
private Updater createUpdater(Article bean) {
Updater updater = Updater.create(bean);
// 控制不能更新的字段
updater.exclude(Article.PROP_WEBSITE);
updater.exclude(Article.PROP_CONFIG);
updater.exclude(Article.PROP_CONTENT_RES_PATH);
updater.exclude(Article.PROP_ADMIN_CHECK);
updater.exclude(Article.PROP_ADMIN_DISABLE);
updater.exclude(Article.PROP_ADMIN_INPUT);
updater.exclude(Article.PROP_CHECK);
updater.exclude(Article.PROP_CHECK_OPINION);
updater.exclude(Article.PROP_CHECK_STEP);
updater.exclude(Article.PROP_CHECK_TIME);
updater.exclude(Article.PROP_CONTENT_RES_PATH);
updater.exclude(Article.PROP_DISABLE_TIME);
updater.exclude(Article.PROP_REJECT);
return updater;
}
private Updater createMemberUpdate(Article bean) {
Updater updater = Updater.create(bean, UpdateMode.MIN);
updater.include(Article.PROP_CHANNEL);
updater.include(Article.PROP_TITLE);
updater.include(Article.PROP_AUTHOR);
updater.include(Article.PROP_ORIGIN);
updater.include(Article.PROP_DESCRIPTION);
updater.include(Article.PROP_DRAFT);
updater.include("content");
return updater;
}
public Object updateByUpdater(Updater updater) {
return dao.updateByUpdater(updater);
}