- 浏览: 1112692 次
文章分类
- 全部博客 (379)
- S2SH (16)
- stuts2 (0)
- java语言 (81)
- JSP (17)
- <html>元素 (11)
- javaweb (4)
- web容器 (3)
- ext (23)
- javaScript (48)
- ant (1)
- liferay (1)
- sql (9)
- css (42)
- 浏览器设置 (3)
- office_world (1)
- eclipse (4)
- 其它 (28)
- 操作系统 (5)
- android (6)
- Struts2 (11)
- RegEx (3)
- mysql (5)
- BigDATA (1)
- Node.js (1)
- Algorithm (10)
- Apache Spark (1)
- 数据库 (5)
- linux (2)
- git (1)
- Adobe (3)
- java语言,WebSocket (1)
- Maven (3)
- SHELL (1)
- XML (2)
- 数学 (2)
- Python (2)
- Java_mysql (1)
- ReactJS (6)
- 养生 (4)
- Docker (1)
- Protocols (3)
- java8 (2)
- 书籍 (1)
- Gradle (2)
- AngularJS (5)
- SpringMVC (2)
- SOAP (1)
- BootstrapCSS (1)
- HTTP协议 (1)
- OAuth2 (1)
最新评论
-
Lixh1986:
Java并发编程:自己动手写一把可重入锁https://blo ...
Java之多线程之Lock与Condition -
Lixh1986:
http://win.51apps.com.cn/https: ...
temp -
ztwsl:
不错,支持很好
HttpServletRequest和ServletRequest的区别 -
guodongkai:
谢谢您能将知识精华汇编总结,让初学者们从原理中学会和提高。
javaScript之function定义 -
kangwen23:
谢谢了,顶顶
struts2中的ValueStack学习
今天做了个测试,写了个测试用例来看看merge与update时控制台打印出来的日志有什么不一样。实体bean很简单,就id和name两个字段,接下来分别给出以下几种测试情形的控制台日志内容:
1. 数据库记录已存在,更改person的name为一个新的name。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from
person person0_ where person0_.id=?
Hibernate: update person set name=?
where id=?
update方法打印出的日志如下:
Hibernate: update person set name=?
where id=?
2. 数据库记录已存在,更改person的name和数据库里对应id记录的name一样的值。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_,
person0_.name as name0_0_ from person person0_ where person0_.id=?
此处相对于第一种情形少了update的动作
update方法打印出的日志如下:
Hibernate: update person set name=? where id=?
3. 数据库记录不存在。也就是你传的实体bean的ID在数据库没有对应的记录。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_
from person person0_ where person0_.id=?
Hibernate: insert into person (name) values (?)
如果没有对应的记录,merge会把该记录当作新的记录来插入。
此处我很疑惑,因为我传得person实体对象里写明了id值的,它为什么还会做插入的动作呢?(如果使用不好,则会在更新时,不会更新而是新增一行记录!!!)
在做更新操作时,在merge之前先要持久化一下?
update方法打印出的日志如下:
Hibernate: update person set name=? where id=?
2009-11-22 20:59:55,359 ERROR [org.hibernate.jdbc.AbstractBatcher] -
Exception executing batch:
org.hibernate.StaleStateException: Batch update
returned unexpected row count from update [0]; actual row count: 0; expected: 1
以下的内容摘抄自网上:
当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态。
当我们使用merge的时候,执行完成后,我们提供的对象A还是脱管状态。hibernate或者是new了一个B(此时执行插入操作),或者检索到一个持久对象B(此时执行更新操作),并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态。
----------------------------------
使用merge方法,如果数据库中有该记录,则更新该记录,如果不存在该记录,则进行insert操作。
使用update的话,会无条件执行update。
也就是说如果数据库中有该记录的话,merge和update是一样的。
但是如果数据库中没有该记录,使用merge执行insert,不会报错,而使用update会报错。
不同之处在于,update可以持久化类,merge不行 --- 重要
---------------------------------------
假设有个Student stu类,session.update(stu),merge也是一样。
不同之处在于,update可以持久化类,merge不行,执行session.merge(stu)之后,stu对象如果之前不是持久化状态,stu对象依然不会被关联到session上。
----------------------------------------
谁懂得hibernate的merge方法?
我使用merge方法。老是报could not load an entity的异常。
配置文件,一定没有问题。
于是,我写了个junit的单元测试。这个单元测试继承了HibernateDaoSupport,并注入了sessionFactory,并调用
this.getHibernateTemplate.merge 方法,还是could not load an entity.
是我对merge理解有问题,还是其他什么问题?
用update是直接把实体和数据库同步,而是要merge方法时 merge操作的是实体的代理对象,所以我们用它时一定要把它放到事务中执行,否则会报could not load an entity异常,
意思是在:this.getHibernateTemplate().merge(dc);语句前面开启一个事务就OK
=========================================================
理一下思路:(没有验证)
使用merge方法时,
如果存在一个持久化的对象,则执行 update 操作。
如果不存在一个持久化的对象,则进行插入操作。
所以,对象需要先持久化后,再进行 merge() 。这里的持久化不是数据库中是否有这条记录,而是 Hibernate 中数据的状态。如果数据库中存在一条记录,而没有被 Hibernate 持久化,使用 merge() 时,仍然执行的是新增一条记录操作。而不是更新操作。
-
引用:
http://www.cnblogs.com/hyteddy/archive/2011/05/10/2041762.html
1. 数据库记录已存在,更改person的name为一个新的name。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from
person person0_ where person0_.id=?
Hibernate: update person set name=?
where id=?
update方法打印出的日志如下:
Hibernate: update person set name=?
where id=?
2. 数据库记录已存在,更改person的name和数据库里对应id记录的name一样的值。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_,
person0_.name as name0_0_ from person person0_ where person0_.id=?
此处相对于第一种情形少了update的动作
update方法打印出的日志如下:
Hibernate: update person set name=? where id=?
3. 数据库记录不存在。也就是你传的实体bean的ID在数据库没有对应的记录。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_
from person person0_ where person0_.id=?
Hibernate: insert into person (name) values (?)
如果没有对应的记录,merge会把该记录当作新的记录来插入。
此处我很疑惑,因为我传得person实体对象里写明了id值的,它为什么还会做插入的动作呢?(如果使用不好,则会在更新时,不会更新而是新增一行记录!!!)
在做更新操作时,在merge之前先要持久化一下?
update方法打印出的日志如下:
Hibernate: update person set name=? where id=?
2009-11-22 20:59:55,359 ERROR [org.hibernate.jdbc.AbstractBatcher] -
Exception executing batch:
org.hibernate.StaleStateException: Batch update
returned unexpected row count from update [0]; actual row count: 0; expected: 1
以下的内容摘抄自网上:
当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态。
当我们使用merge的时候,执行完成后,我们提供的对象A还是脱管状态。hibernate或者是new了一个B(此时执行插入操作),或者检索到一个持久对象B(此时执行更新操作),并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态。
----------------------------------
使用merge方法,如果数据库中有该记录,则更新该记录,如果不存在该记录,则进行insert操作。
使用update的话,会无条件执行update。
也就是说如果数据库中有该记录的话,merge和update是一样的。
但是如果数据库中没有该记录,使用merge执行insert,不会报错,而使用update会报错。
不同之处在于,update可以持久化类,merge不行 --- 重要
---------------------------------------
假设有个Student stu类,session.update(stu),merge也是一样。
不同之处在于,update可以持久化类,merge不行,执行session.merge(stu)之后,stu对象如果之前不是持久化状态,stu对象依然不会被关联到session上。
----------------------------------------
谁懂得hibernate的merge方法?
我使用merge方法。老是报could not load an entity的异常。
配置文件,一定没有问题。
于是,我写了个junit的单元测试。这个单元测试继承了HibernateDaoSupport,并注入了sessionFactory,并调用
this.getHibernateTemplate.merge 方法,还是could not load an entity.
是我对merge理解有问题,还是其他什么问题?
//单元测试如下 public class MergeTest extends HibernateDaoSupport { @Test public void testMerge(){ //获取spring配置 ApplicationContext act = new FileSystemXmlApplicationContext("/WebRoot/WEB-INF/applicationContext.xml"); //注入sesssionFactory this.setSessionFactory((SessionFactory)act.getBean("sessionFactory")); //创建一个模拟的DocumentCatalog 数据中已经有个 id = 1的数据 DocumentCatalog dc = new DocumentCatalog(); dc.setId(1); dc.setName("crying!!!!!"); //我认为,这时候,数据库中的 id = 1的数据,会被update,但是,发生could not load an entity错误。 //数据库映射没有错误,换成update就能顺利更新。 this.getHibernateTemplate().merge(dc); } }
用update是直接把实体和数据库同步,而是要merge方法时 merge操作的是实体的代理对象,所以我们用它时一定要把它放到事务中执行,否则会报could not load an entity异常,
意思是在:this.getHibernateTemplate().merge(dc);语句前面开启一个事务就OK
=========================================================
理一下思路:(没有验证)
使用merge方法时,
如果存在一个持久化的对象,则执行 update 操作。
如果不存在一个持久化的对象,则进行插入操作。
所以,对象需要先持久化后,再进行 merge() 。这里的持久化不是数据库中是否有这条记录,而是 Hibernate 中数据的状态。如果数据库中存在一条记录,而没有被 Hibernate 持久化,使用 merge() 时,仍然执行的是新增一条记录操作。而不是更新操作。
-
引用:
http://www.cnblogs.com/hyteddy/archive/2011/05/10/2041762.html
发表评论
-
Spring之Interceptor之path patterns路径匹配规则
2018-12-26 11:20 8776Spring之Interceptor之path pattern ... -
Spring4.X之Constructor Injection 构造方法注入
2018-12-24 17:37 1574Spring4.X之Constructor Injection ... -
SpringMVC之@RequestMapping @ResponseBody 和 @RequestBody 注解的用法
2018-05-30 10:55 15811、@RequestMapping @RequestMappi ... -
Spring4.X之Bean的Scope
2017-11-06 16:29 1200https://docs.spring.io/spring/d ... -
Spring4.X之基于Java注解的配置(与SpringBoot的诞生)
2017-11-02 16:57 4149最近项目用到了SpringBoot,对其没有xml配置就可以运 ... -
03 - SpringBoot: Building a RESTful Web Service
2017-09-25 17:47 1024Building a RESTful Web Service ... -
02 - Difference between spring @Controller and @RestController annotation
2017-09-25 17:04 889Difference between spring @Con ... -
01 -Spring Framework: @RestController vs. @Controller
2017-09-25 16:45 745Spring MVC Framework and REST ... -
Spring - MVC 思维导图,让Spring不再难懂
2017-08-09 03:21 1080引用: http://www.iteye.com/news/3 ... -
Struts2拦截器原理以及实例
2017-02-15 12:49 472Struts2拦截器原理以及实例 http://www.cnb ... -
SSH之Struts2 VS. SpringMVC
2017-02-07 10:26 995Struts 2 vs SpringMVC - Battl ... -
Maven之POM之SSH之libs之configuration
2017-02-05 08:56 782Maven repo libs: Servlet API, ... -
Hibernate自定义查询
2014-02-24 16:29 1584public void addCarmera(Carmera ... -
Hibernate对象的生命周期
2013-07-10 16:32 1832一、情景描述 鉴于:hibernate是面向对象(实体、en ... -
通过配置struts.xml解决 struts2和 dwr兼容的问题
2012-11-20 10:20 2079众所周知,strust2 通过在 web.xml中配置 fil ...
相关推荐
### Hibernate merge、update与saveOrUpdate方法的区别 在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现...
Hibernate中session的merge以及update方法
在Java的ORM框架Hibernate中,`merge()`是一个非常重要的操作,它主要用于将游离态或瞬态的对象合并到持久化状态。理解`merge()`的工作原理对于优化数据操作和避免潜在的冲突至关重要。以下是对`merge()`函数的详细...
当你从数据库加载一个对象,修改其属性,然后调用`update()`方法,Hibernate会根据对象的状态自动执行相应的SQL UPDATE语句。然而,如果对象不在Session缓存中,`update()`方法可能会失效,因为Hibernate无法跟踪...
在Java的持久化框架Hibernate中,管理对象与数据库之间的交互是通过一系列的方法完成的,其中包括`save()`, `saveOrUpdate()`, `persist()`, `merge()`, 和 `update()`。这些方法各有其特点和适用场景,理解它们的...
在探讨“merge的注意事项”这一主题时,我们深入解析Hibernate框架中merge操作的特性与应用场景,以及它与其他数据持久化方法的区别,特别是与saveOrUpdate函数的对比。这不仅有助于理解Hibernate的核心机制,还能...
Hibernate框架是中国Java开发领域广泛应用的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。这个“Hibernate框架jia包”包含了你需要在项目中使用Hibernate的所有核心库和依赖,确保你能顺利进行...
这涉及到使用Session的save()、saveOrUpdate()、load()、get()、update()、merge()和delete()方法。同时,还会讨论事务管理和并发控制,确保数据的一致性和完整性。 查询语言在Hibernate中主要有两种:HQL...
Hibernate提供了多种保存方式,包括save()、persist()、update()、saveOrUpdate()等,了解这些方法的区别非常重要,以便正确使用它们。本文将对Hibernate的各种保存方式进行详细的比较和分析。 一、预备知识 在...
5. CRUD操作:Hibernate提供了便捷的方法来完成创建(save()、persist())、读取(get()、load()、query())、更新(update()、merge())和删除(delete())对象的操作。其中,HQL(Hibernate Query Language)和...
Hibernate提供了save()、update()、merge()和delete()方法来处理对象的持久化状态。其中,save()适合新对象的插入,update()用于已存在对象的更新,merge()则是合并当前对象状态到持久化对象,delete()则删除对象。 ...
1. 持久化操作:通过SessionFactory创建Session,然后调用Session的save()、update()、delete()和merge()方法,实现对象的增删改操作。 2. 查询:使用Query或Criteria API,支持复杂条件、分页、排序等查询,甚至...
- **更新(Update)**:修改实体后调用 `update()` 或 `merge()` 更新数据库中的记录。 - **删除(Delete)**:使用 `delete()` 方法移除实体。 5. **事务管理**:在数据库操作中使用 `Transaction` 对象进行事务...
- `update()`/`merge()`:更新对象。 - `delete()`:删除对象。 - `query()`/`createCriteria()`:执行查询。 - **事务管理**:在Hibernate中,通常使用Transaction接口处理事务,包括开始、提交、回滚等操作。 ...
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
它还涵盖了持久化对象的状态管理(瞬时态、持久态、游离态和删除态),以及Entity的save()、update()、merge()、delete()方法的具体使用场景。此外,还讲解了Criteria查询、HQL(Hibernate Query Language)和JPQL...
在 Hibernate 中,对象的状态管理是至关重要的,因为它直接影响到对象如何与数据库交互。以下是 Hibernate 中对象的三种状态以及相关的保存方法: 1. **瞬时对象(Transient Objects)** - 当使用 `new` 关键字...
例如,通过Session的save()或saveOrUpdate()方法创建新记录,get()或load()方法读取记录,update()或merge()更新记录,以及delete()删除记录。 7. **HQL(Hibernate Query Language)**:这是Hibernate提供的SQL的...
通过Session的save()、saveOrUpdate()、merge()和update()方法,可以改变对象的状态。 7. **缓存机制**: Hibernate内置了一级缓存和二级缓存。一级缓存是Session级别的,自动管理实体对象的缓存,提高性能。二级...
- **更新(Update):** 使用`Session.update()`或`Session.merge()`更新已存在的实体。 - **删除(Delete):** `Session.delete()`方法用于从数据库中移除对象。 3. **HQL(Hibernate Query Language):** 是...