1.EntityManaget的persist和merge方法的区别

1.persist和merge的区别:

Persist:添加

Merge : 分两种情况,当对象存在id,则修改;当对象不存在id则添加。

看个例子:

 1  1 public class Account {
 2  2    private AccountRole accountRole;
 3  3    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
 4  4    public AccountRole getAccountRole() {
 5  5       return accountRole;
 6  6    }
 7  7
 8  8 //添加account的代码段
 9  9 AccountRole role = accountService.getRoleFromDatabase(AccountRoles.ROLE_USER);
10 10 account.setAccountRole(role);
11 11 entityManager.persist(account);//entityManager.merge(account)

问题说明: role是从数据库中查询出来的,在这种情况下 用persist方法保存account对象,persist同时会将role也保存,这时候因为role这条记录在数据库中已经存在,所以

这时候调用 persist(account);会报异常。

解决方法:

1. 可以取消掉persist方法调用时保存关联对象,即取消掉cascade = CascadeType.PERSIST

2.可以使用merge方法替代persist。

所以从这可以看出,persist是直接保存,merge是根据id是否存在来判断是保存还是修改(id存在,则修改; id不存在,则添加),

原文地址:https://www.cnblogs.com/WNof11020520/p/8987385.html

时间: 2024-11-10 13:44:37

1.EntityManaget的persist和merge方法的区别的相关文章

[原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Hibernate中Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法的区别

Hibernate的对象有三种状态,分别是:瞬时态(transient).持久态(persistent).游离态(detached) 1.瞬时态的实例可以通过调用save().persist()或者saveOrUpdate()方法变成持久态 2.游离态的实例可以通过调用 update().saveOrUpdate().lock()或者replicate()方法变成持久态 3.save()和update()方法的区别在于前者是将瞬时态对象变成持久态,后者是将游离态对象变成持久态 4.merge()

hibernate中的merge()方法

Hibernate提供有save().persist().savaOrUpdate()和merge()等方法来提供插入数据的功能.前三者理解起来较后者容易一些,而merge()方法从api中的介绍就可以看出它是最复杂的,因此要特别留意一下. Hibernate的api中关于merge()方法的原文 merge Object merge(Object object) throws HibernateException Copy the state of the given object onto

AutoGenerateColumns属性对WinForm中数据集AcceptChanges和Merge方法执行时间的影响

WinForm窗口中有一个DataGridView控件,用来显示数据源(DataTable)中的数据,数据源大概有60个字段. 当数据源中的记录数不多,比如几条.十几条记录时,执行AcceptChanges和Merge方法看不出有什么性能问题. 但是当数据源中的数据记录数达到1000条的时候,执行AcceptChanges和Merge两个方法所要耗费的时间明显变长,达到7.8秒才能完成,这个时间甚至比网络数据传输加上数据库更新所用的时间之和还要长! 经过一番摸索之后,发现在为DataGridVi

Hibernate中的merge方法

Hibernate中有一个常见的错误: A different object with the same identifier value was already associated with the session 在一个session中存在两个不同的实体却有着相同的身份标签(主键)是会报错的,想要避免这种错误可以使用Hibernate中的merge方法. merge方法的作用: new一个对象并设置ID时,这个对象会被当作游离态处理,在使用merge时,如果在数据库中不能能找到这条记录,则

【hibernate merge】session1.merge(T entity)方法的含义和update方法的区别

1>session1.merge(T entity) 合并实体的方法. 2>merge的作用是:新new一个对象,如果该对象设置了ID,则这个对象就当作游离态处理:                                       当ID在数据库中不能找到时,用update的话肯定会报异常,然而用merge的话,就会insert.                                       当ID在数据库中能找到的时候,update与merge的执行效果都是更新数据,

【SSH三大框架】Hibernate基础第三篇:实体对象的三种状态以及get、load、persist三个方法的详解

一.Hibernate中实体对象分为三种状态:瞬态.持久.脱管 瞬态(transient):这种状态下的实体对象,数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来的并且与Session没有任何关系的对象. 持久(persistent):数据库中有数据与之对应,当前与Session有关联,并且相关联的Session并没有关闭,事务没有提交.PS:持久对象发生改变的时候,在事务提交的时候会影响到数据库中. 脱管(detached):数据库中有数据与之对应,但当前没有Se

前端学习笔记汇总(之merge方法)

学习笔记 关于Jquery的merge方法 话不多说,先上图 使用jquery时,其智能提示如上,大概意思就是合并first和second两个数组,得到的结果是first+(second去重后的结果)的并集 接下来,做出测试: 1 $(function () { 2 var arr1 = ['apple', 'orange',1, 'cherry', 'orange']; 3 var arr2 = ['chen', 343, true, 'cherry',1]; 4 var result = $

Hibernate的merge与update方法的区别

今天做了个测试,写了个测试用例来看看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