hibernate对象更新的3种效率解决方案

大家都知道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;
	}


Manager控制层中调用dao更新
public Object updateByUpdater(Updater updater) {
		return dao.updateByUpdater(updater);
	}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值