EntityManager的merge()方法相当于hibernate中session的saveOrUpdate()方法;
用于实体的插入和更新操作;
 
1.临时状态的实体对象
创建一个新对象;
将临时对象的属性复制到新对象;
持久化新对象;
执行insert插入到数据库;
代码:
     //merge的第一种情况:临时对象
     @Test
     public void testMerge1(){
           Emp emp=new Emp();
           emp.setBirthday(new Date());
           emp.setName("郭将军");
           emp.setSalary(200);
           
           Emp emp2=manager.merge(emp);
           System.out.println("临时对象emp的id:"+emp.getId());
           System.out.println("实际插入的对象emp2的id:"+emp2.getId());
     }
结果:
Hibernate:
    insert
    into
        tb_emp
        (birthday, name, salary)
    values
        (?, ?, ?)
临时对象emp的id:null
实际插入的对象emp2的id:26
 
2.游离对象
游离对象说白了就是有id的临时对象;
查看缓存中是否存在id相同的持久化对象;
如果不存在,就查看数据库,中是否有id相同的记录;
 
1)缓存中有id相同的持久化对象
将游离对象的属性拷贝到id对应的持久化对象;
在数据库中执行update操作;
 
2)缓存中没有id相同的持久化对象;但数据库中有相同id的记录
执行查询语句用该id为条件,获取一个持久化对象;
将游离对象的属性拷贝到持久化对象;
执行update操作;
 
3)数据库和缓存中都没有游离对象id相同的记录
和临时对象一样的步骤;
注意:实际插入对象的id并不是该游离对象的id;
代码:
     //merge的第二种情况:游离对象;数据库和缓存中都没有id相同的
           @Test
           public void testMerge2(){
                Emp emp=new Emp();
                emp.setBirthday(new Date());
                emp.setName("王司徒");
                emp.setSalary(200);
                emp.setId(5);
                
                Emp emp2=manager.merge(emp);
                System.out.println("游离对象emp的id:"+emp.getId());
                System.out.println("实际插入的对象emp2的id:"+emp2.getId());
           }
结果:
Hibernate:
    select
        emp0_.id as id1_0_0_,
        emp0_.birthday as birthday2_0_0_,
        emp0_.name as name3_0_0_,
        emp0_.salary as salary4_0_0_
    from
        tb_emp emp0_
    where
        emp0_.id=?
Hibernate:
    insert
    into
        tb_emp
        (birthday, name, salary)
    values
        (?, ?, ?)
游离对象emp的id:5
实际插入的对象emp2的id:27
 
3.与hibernate的不同
hibernate的session无法同时与两个id相同的对象相关联;
也就是说:find和merge同时使用时如果id相同可能会报错;
而EntityManager是复制操作,可以这样用;
 
 
 
 
 
 
 
 
 
 

EntityManager的merge()方法的更多相关文章

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

    1.persist和merge的区别: Persist:添加 Merge : 分两种情况,当对象存在id,则修改:当对象不存在id则添加. 看个例子: 1 public class Account { ...

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

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

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

    学习笔记 关于Jquery的merge方法 话不多说,先上图 使用jquery时,其智能提示如上,大概意思就是合并first和second两个数组,得到的结果是first+(second去重后的结果) ...

  4. Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别

    首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...

  5. Hibernate: merge方法

    在Hibernate中,有save.persist.savaOrUpdate.merge等方法有插入数据的功能.前三者理解起来较后者容易一些,merge方法从api中的介绍就看以看出它是最复杂的.下面 ...

  6. pandas的merge方法

    数据合并时可以使用merge方法,对两个dataFrame根据某一个series合并,这个方法非常好用,只要找到了合并的标准,新的数据就可以重构出来. 1.命令: pd.merge() on:列名,j ...

  7. hibernate中的merge()方法

    Hibernate提供有save().persist().savaOrUpdate()和merge()等方法来提供插入数据的功能.前三者理解起来较后者容易一些,而merge()方法从api中的介绍就可 ...

  8. 【转载】C#的Merge方法合并两个DataTable对象的数据

    在C#中的Datatable类中,可以使用DataTable类的Merge方法对两个相同结构的DataTable对象进行求并集运算,将两个DataTable对象的数据行合并到其中一个DataTable ...

  9. EntityManager的基本方法

    1.Persistence 主要用来获取EntityManagerFactory的实例; 通过静态方法:createEntityManagerFactory 来实现: 该方法有两个重载版本:     ...

随机推荐

  1. 使用Minikube运行一个本地单节点Kubernetes集群

    使用Minikube是运行Kubernetes集群最简单.最快捷的途径,Minikube是一个构建单节点集群的工具,对于测试Kubernetes和本地开发应用都非常有用. ⒈安装Minikube Mi ...

  2. 基于C#开发的扩展按钮控件

    最近在准备一套自定义控件开发的课程,下面将第一个做的按钮控件分享给大家. 其实这个控件属于自定义控件中的扩展控件,与组合控件和GDI+开发的控件不同,这个控件是继承原生的Button, 这个控件的目的 ...

  3. Android中如何判断内存卡是否存在

    if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { /* 得到SD卡得路 ...

  4. O057、Delete Volume 操作

    参考https://www.cnblogs.com/CloudMan6/p/5648665.html   状态为Available 的volume 才能够被delete,如果volume当前已经被at ...

  5. promise使用的正确方式

    一开始恨不能理解下面的代码,为什么可以一直then下去,什么时候要直接return  xxx,什么时候return 一个promise,什么时候用Promise.resolve() function ...

  6. day12 css样式

    目录 1.标签分类   2.浮动布局   3.margin塌陷   4.定位postion   5.背景图 一. 标签分类 默认在标准文档流 行内标签 span,a,em,i,strong,b,inp ...

  7. python之字典二 内置方法总结

    Python字典包含了以下内置方法: clear()函数用于删除字典内所有元素 dict1 = {, 'Class': 'First'} print('the start len %d' % len( ...

  8. java_day10_多线程

    第十章:线程 1.进程和线程的概述 1)进程和线程定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和 ...

  9. 【wifi移植 2】 移植wpa_supplicant

    参考文章: http://bbs.eeworld.com.cn/thread-447273-1-1.html(加精作品) 1. 下载源码 下载wpa_supplicant-2.2.tar(openss ...

  10. JDBC概述及JDBC完成对Oracle的增删改查

    什么是JDBC JDBC(Java Data Base Connectivity,Java数据库连接),是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问.它由一组用Java语言 ...