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`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现...
在探讨“merge的注意事项”这一主题时,我们深入解析Hibernate框架中merge操作的特性与应用场景,以及它与其他数据持久化方法的区别,特别是与saveOrUpdate函数的对比。这不仅有助于理解Hibernate的核心机制,还能...
在Java的持久化框架Hibernate中,管理对象与数据库之间的交互是通过一系列的方法完成的,其中包括`save()`, `saveOrUpdate()`, `persist()`, `merge()`, 和 `update()`。这些方法各有其特点和适用场景,理解它们的...
在Java的持久化框架Hibernate中,实体对象的状态管理和`saveOrUpdate`方法是核心概念,对于理解和有效使用Hibernate至关重要。在本教程中,我们将深入探讨实体对象的三种状态以及`saveOrUpdate`方法的工作原理。 ...
这涉及到使用Session的save()、saveOrUpdate()、load()、get()、update()、merge()和delete()方法。同时,还会讨论事务管理和并发控制,确保数据的一致性和完整性。 查询语言在Hibernate中主要有两种:HQL...
- 可以通过 `Session` 的 `update()`、`saveOrUpdate()` 或 `merge()` 方法将脱管对象重新关联到 `Session`,并更新为持久对象。 **保存方法的区别:** - **save()**: 用于将瞬时对象持久化,如果对象已经具有...
例如,`save()`和`saveOrUpdate()`用于插入或更新对象,`get()`和`load()`用于查询,`update()`和`merge()`用于更新,`delete()`用于删除。 5. **查询语言**:除了使用SQL,Hibernate还提供了HQL(Hibernate Query ...
例如,通过Session的save()或saveOrUpdate()方法创建新记录,get()或load()方法读取记录,update()或merge()更新记录,以及delete()删除记录。 7. **HQL(Hibernate Query Language)**:这是Hibernate提供的SQL的...
通过Session的save()、saveOrUpdate()、merge()和update()方法,可以改变对象的状态。 7. **缓存机制**: Hibernate内置了一级缓存和二级缓存。一级缓存是Session级别的,自动管理实体对象的缓存,提高性能。二级...
例如,Session的save()或saveOrUpdate()用于保存实体,delete()用于删除,get()和load()用于获取实体,update()或merge()用于更新。 5. 查询机制:Hibernate支持HQL和Criteria API进行查询。HQL是面向对象的查询...
而`get()`和`load()`用于根据主键获取对象,`update()`和`merge()`用于更新对象,`delete()`则用于删除对象。 6. **HQL与Criteria查询** Hibernate 提供了自己的SQL方言——HQL(Hibernate Query Language),它是...
通过`persist()`, `merge()`, `saveOrUpdate()`, `delete()`等方法,可以控制对象的状态转换。 7. **多对一、一对多、多对多关联映射**:Hibernate支持不同关系的实体之间的关联映射,如一对一、一对多、多对一、多...
例如,使用`save()`或`saveOrUpdate()`方法保存实体,`load()`或`get()`方法获取实体,`update()`或`merge()`更新实体,以及`delete()`方法删除实体。 事务处理是数据库操作的重要部分,Hibernate通过`Transaction`...
例如,使用`Session.save()`或`Session.saveOrUpdate()`来保存对象,`Session.load()`或`Session.get()`来读取对象,`Session.update()`或`Session.merge()`来更新对象,`Session.delete()`来删除对象。 9. **HQL...
* 使用 session.merge(object),Hibernate 里面自带的方法,推荐使用。 了解 Hibernate 中的常见异常是非常重要的。通过了解这些异常的原因和解决方案,我们可以更好地使用 Hibernate,提高开发效率和质量。
8. **实体生命周期**:包括瞬态、持久化、托管和游离状态的转换,例如,通过Session的save()、saveOrUpdate()、persist()方法可以使对象进入持久化状态,update()和merge()方法用于更新已存在的实体。 9. **事件...
Hibernate提供了多种保存方式,包括save()、persist()、update()、saveOrUpdate()等,了解这些方法的区别非常重要,以便正确使用它们。本文将对Hibernate的各种保存方式进行详细的比较和分析。 一、预备知识 在...
- **更新(Update)**:对持久化对象的属性进行修改后,调用`Session.update()`或`Session.saveOrUpdate()`来更新数据库。 - **删除(Delete)**:`Session.delete()`方法用于从数据库中移除对象。 7. **事务管理...
例如,使用save()或saveOrUpdate()方法插入数据,使用get()或load()方法加载数据,使用update()或merge()方法更新数据,使用delete()方法删除数据。 6. **HQL和Criteria查询**: Hibernate提供了自己的查询语言HQL,...
- Session的save()、saveOrUpdate()、update()和merge()方法:分别用于持久化新对象、更新已有对象、检查对象状态并更新以及合并临时状态的对象。 - Session的get()和load()方法:用于根据主键获取对象,load()...