`

hibernate merge saveOrUpdate的区别

阅读更多
import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.stereotype.Component;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.alibaba.fastjson.JSON;
import com.anyec.make.bo.ModelBO;
import com.anyec.make.domain.Model;

@Component
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class HibernateTest {
	private ModelBO modelBO;

	public ModelBO getModelBO() {
		return modelBO;
	}
	@Resource
	public void setModelBO(ModelBO modelBO) {
		this.modelBO = modelBO;
	}
	@Test
	public void testMerge(){
		Model model=new Model();
		model.setCnName("test");
		model.setName("testName");
		model.setPackName("testPackName");
		System.out.println(JSON.toJSONString(model));
		modelBO.merge(model);//model的ID不会变
		System.out.println(JSON.toJSONString(model));
		/***
		 * {"children":[],"cnName":"test","id":0,"name":"testName","packName":"testPackName"}
		 * Hibernate: insert into Model (cnName, name, packName) values (?, ?, ?)
		 * */
		model=modelBO.merge(model);//返回被持久化的对象		
		System.out.println(JSON.toJSONString(model));
		/***
		 * {"children":[],"cnName":"test","id":0,"name":"testName","packName":"testPackName"}
		 * Hibernate: insert into Model (cnName, name, packName) values (?, ?, ?)
		 */
		modelBO.merge(model);//持久化对象,先执行select没有发生改变,所以不会被update 
		System.out.println(JSON.toJSONString(model));
		/***
		 * {"children":[],"cnName":"test","id":29,"name":"testName","packName":"testPackName"}
		 * Hibernate: select model0_.id as id5_1_, model0_.cnName as cnName5_1_, model0_.name as name5_1_, model0_.packName as packName5_1_, children1_.modelId as modelId3_, children1_.id as id3_, children1_.id as id4_0_, children1_.btw as btw4_0_, children1_.cnName as cnName4_0_, children1_.editor as editor4_0_, children1_.len as len4_0_, children1_.modelId as modelId4_0_, children1_.name as name4_0_, children1_.refId as refId4_0_, children1_.relation as relation4_0_, children1_.sqlName as sqlName4_0_, children1_.type as type4_0_ from Model model0_ left outer join Field children1_ on model0_.id=children1_.modelId where model0_.id=?
		 * {"children":[],"cnName":"test","id":29,"name":"testName","packName":"testPackName"}
		 */
		
		model.setCnName("cnName78");
		modelBO.merge(model);//持久化对象被改变,执行update 
		System.out.println(JSON.toJSONString(model));
		/**
		 * Hibernate: select model0_.id as id5_1_, model0_.cnName as cnName5_1_, model0_.name as name5_1_, model0_.packName as packName5_1_, children1_.modelId as modelId3_, children1_.id as id3_, children1_.id as id4_0_, children1_.btw as btw4_0_, children1_.cnName as cnName4_0_, children1_.editor as editor4_0_, children1_.len as len4_0_, children1_.modelId as modelId4_0_, children1_.name as name4_0_, children1_.refId as refId4_0_, children1_.relation as relation4_0_, children1_.sqlName as sqlName4_0_, children1_.type as type4_0_ from Model model0_ left outer join Field children1_ on model0_.id=children1_.modelId where model0_.id=?
		 * Hibernate: update Model set cnName=?, name=?, packName=? where id=?
		 * {"children":[],"cnName":"cnName78","id":29,"name":"testName","packName":"testPackName"}
		 */
	}
	@Test
	public void testSaveOrUpdate(){
		Model model=new Model();
		model.setCnName("test");
		model.setName("testName");
		model.setPackName("testPackName");
		System.out.println(JSON.toJSONString(model));
		modelBO.saveOrUpdate(model);//执行INSERT,并且model被持久化了,id被赋值,难怪这个方法返回的是void 
		/**
		 * {"children":[],"cnName":"test","id":0,"name":"testName","packName":"testPackName"}
		 * Hibernate: insert into Model (cnName, name, packName) values (?, ?, ?)
		 */
		System.out.println(JSON.toJSONString(model));//打印有ID
		/***
		 * {"children":[],"cnName":"test","id":30,"name":"testName","packName":"testPackName"}
		 */
		modelBO.saveOrUpdate(model);//执行了update 
		System.out.println(JSON.toJSONString(model));
		/**
		 * Hibernate: update Model set cnName=?, name=?, packName=? where id=?
		 * {"children":[],"cnName":"test","id":30,"name":"testName","packName":"testPackName"}
		 */
	}
	/**
	 * 两者都会进行update或者save操作 不同的是是 
	 * saveOrupdate如果已经在session中都会update, 并且原 实例对象会被持久化,特征是ID会变 
	 * 而 merge在不存在的时候会执行保存,但是原实例对象与被持久化的对象是2个对象,及源对象的ID不会被加载成持久化对象的ID
	 */

}

分享到:
评论

相关推荐

    Hibernate merge、update与saveOrUpdate方法的区别

    ### Hibernate merge、update与saveOrUpdate方法的区别 在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现...

    merge的注意事项

    在探讨“merge的注意事项”这一主题时,我们深入解析Hibernate框架中merge操作的特性与应用场景,以及它与其他数据持久化方法的区别,特别是与saveOrUpdate函数的对比。这不仅有助于理解Hibernate的核心机制,还能...

    save, saveOrUpdate, persist, merge, update 区别.docx

    在Java的持久化框架Hibernate中,管理对象与数据库之间的交互是通过一系列的方法完成的,其中包括`save()`, `saveOrUpdate()`, `persist()`, `merge()`, 和 `update()`。这些方法各有其特点和适用场景,理解它们的...

    05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法

    在Java的持久化框架Hibernate中,实体对象的状态管理和`saveOrUpdate`方法是核心概念,对于理解和有效使用Hibernate至关重要。在本教程中,我们将深入探讨实体对象的三种状态以及`saveOrUpdate`方法的工作原理。 ...

    Hibernate实战

    这涉及到使用Session的save()、saveOrUpdate()、load()、get()、update()、merge()和delete()方法。同时,还会讨论事务管理和并发控制,确保数据的一致性和完整性。 查询语言在Hibernate中主要有两种:HQL...

    Hibernate对象状态以及各种保存方法的区别

    - 可以通过 `Session` 的 `update()`、`saveOrUpdate()` 或 `merge()` 方法将脱管对象重新关联到 `Session`,并更新为持久对象。 **保存方法的区别:** - **save()**: 用于将瞬时对象持久化,如果对象已经具有...

    hibernate4.2.1

    例如,`save()`和`saveOrUpdate()`用于插入或更新对象,`get()`和`load()`用于查询,`update()`和`merge()`用于更新,`delete()`用于删除。 5. **查询语言**:除了使用SQL,Hibernate还提供了HQL(Hibernate Query ...

    Hibernate4.1.1的Demo实例

    例如,通过Session的save()或saveOrUpdate()方法创建新记录,get()或load()方法读取记录,update()或merge()更新记录,以及delete()删除记录。 7. **HQL(Hibernate Query Language)**:这是Hibernate提供的SQL的...

    Hibernate教程03_Hibernate核心开发接口介绍

    通过Session的save()、saveOrUpdate()、merge()和update()方法,可以改变对象的状态。 7. **缓存机制**: Hibernate内置了一级缓存和二级缓存。一级缓存是Session级别的,自动管理实体对象的缓存,提高性能。二级...

    MLDN_Hibernate开发实战讲解视频教程

    例如,Session的save()或saveOrUpdate()用于保存实体,delete()用于删除,get()和load()用于获取实体,update()或merge()用于更新。 5. 查询机制:Hibernate支持HQL和Criteria API进行查询。HQL是面向对象的查询...

    Hibernate 框架测试版本

    而`get()`和`load()`用于根据主键获取对象,`update()`和`merge()`用于更新对象,`delete()`则用于删除对象。 6. **HQL与Criteria查询** Hibernate 提供了自己的SQL方言——HQL(Hibernate Query Language),它是...

    hibernate5.2.12源码包

    通过`persist()`, `merge()`, `saveOrUpdate()`, `delete()`等方法,可以控制对象的状态转换。 7. **多对一、一对多、多对多关联映射**:Hibernate支持不同关系的实体之间的关联映射,如一对一、一对多、多对一、多...

    Hibernate中文Api最新参考文档

    例如,使用`save()`或`saveOrUpdate()`方法保存实体,`load()`或`get()`方法获取实体,`update()`或`merge()`更新实体,以及`delete()`方法删除实体。 事务处理是数据库操作的重要部分,Hibernate通过`Transaction`...

    hibernate入门简单实例

    例如,使用`Session.save()`或`Session.saveOrUpdate()`来保存对象,`Session.load()`或`Session.get()`来读取对象,`Session.update()`或`Session.merge()`来更新对象,`Session.delete()`来删除对象。 9. **HQL...

    hibernate常见异常

    * 使用 session.merge(object),Hibernate 里面自带的方法,推荐使用。 了解 Hibernate 中的常见异常是非常重要的。通过了解这些异常的原因和解决方案,我们可以更好地使用 Hibernate,提高开发效率和质量。

    ORM hibernate。jar包

    8. **实体生命周期**:包括瞬态、持久化、托管和游离状态的转换,例如,通过Session的save()、saveOrUpdate()、persist()方法可以使对象进入持久化状态,update()和merge()方法用于更新已存在的实体。 9. **事件...

    Hibernate的各种保存方式的区别详解

    Hibernate提供了多种保存方式,包括save()、persist()、update()、saveOrUpdate()等,了解这些方法的区别非常重要,以便正确使用它们。本文将对Hibernate的各种保存方式进行详细的比较和分析。 一、预备知识 在...

    Hibernate之API初识及增删改查实现案例hibernate003

    - **更新(Update)**:对持久化对象的属性进行修改后,调用`Session.update()`或`Session.saveOrUpdate()`来更新数据库。 - **删除(Delete)**:`Session.delete()`方法用于从数据库中移除对象。 7. **事务管理...

    hibernate3.6框架中文文档

    例如,使用save()或saveOrUpdate()方法插入数据,使用get()或load()方法加载数据,使用update()或merge()方法更新数据,使用delete()方法删除数据。 6. **HQL和Criteria查询**: Hibernate提供了自己的查询语言HQL,...

    hibernate_first_new项目源码

    - Session的save()、saveOrUpdate()、update()和merge()方法:分别用于持久化新对象、更新已有对象、检查对象状态并更新以及合并临时状态的对象。 - Session的get()和load()方法:用于根据主键获取对象,load()...

Global site tag (gtag.js) - Google Analytics