请教:Hibernate 中的attachDirty,attachClean,merge之间的区别?????多谢

解决方案 »

  1.   

    merge:将传入的detached状态的对象的属性复制到持久化对象中,并返回该持久化对象 。如果该session中没有关联的持久化对象,加载一个,如果传入对象未保存,保存一个副本并作为持久对象返回,传入对象依然保持detached状态。attachDirty:将传入的对象持久化并保存。如果对象未保存(Transient状态),调用save方法保存。如果对象已保存(Detached状态),调用update方法将对象与Session重新关联。attachClean:将传入的对象状态设置为Transient状态。 
      

  2.   

        // 关于merge() attachDirty() attachClean()三种方法下面做一个简单的介绍
        /**
        * 将传入的detached状态的对象的属性复制到持久化对象中,并返回该持久化对象。
        * 如果该session中没有关联的持久化对象,加载一个,如果传入对象未保存,保存一个副本并作为持久对象返回,传入对象依然保持detached状态。
        */
        public CodeDepts merge(Usertable detachedInstance) {
            log.debug("merging Usertable instance");
            try {
                Usertable result = (Usertable) getSession()
                    .merge(detachedInstance);
                log.debug("merge successful");
                return result;
            } catch (RuntimeException re) {
                log.error("merge failed", re);
                throw re;
            }
        }    /**
        * 将传入的对象持久化并保存。
        * 如果对象未保存(Transient状态),调用save方法保存。如果对象已保存(Detached状态),调用update方法将对象与Session重新关联。
        */
        public void attachDirty(Usertable instance) {
             log.debug("attaching dirty Usertable instance");
            try {
                getSession().saveOrUpdate(instance);
                log.debug("attach successful");
            } catch (RuntimeException re) {
                log.error("attach failed", re);
                throw re;
            }
        }    /**
        * 将传入的对象状态设置为Transient状态
        */
        public void attachClean(Usertable instance) {
            log.debug("attaching clean Usertable instance");
            try {
                getSession().lock(instance, LockMode.NONE);
                log.debug("attach successful");
            } catch (RuntimeException re) {
                log.error("attach failed", re);
                throw re;
            }
        }