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. fio安装使用

    # wget http://brick.kernel.dk/snaps/fio-2.2.5.tar.gz # tar xvf fio-2.2.5.tar.gz# cd fio-2.2.5# ./con ...

  2. redis 命令 setbit、bitcount、getbit、bitop

    1.SETBIT key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit). 在redis中,存储的字符串都是以二级制的进行存在的. 举例: 设置一个 ke ...

  3. WPF——Application

    Application类处于WPF应用程序的最顶端,main函数就在这个类中. Application类的作用: 截图连接 https://docs.microsoft.com/zh-cn/dotne ...

  4. [转载]Flex的文件规则

    原文在:https://blog.csdn.net/hczhiyue/article/details/20483209 文章中给的一个定义很明白,对于初学者来说很有帮助: 什么是 FLEX?它是一个自 ...

  5. jquery文件上传版 插件

    /*! * jQuery Form Plugin * version: 4.2.2 * Requires jQuery v1.7.2 or later * Project repository: ht ...

  6. Idea破解2019

    转自:https://blog.csdn.net/qq_36622149/article/details/88910952 Idea破解,亲测有效,轻量快捷高效更新记录:首次:Idea破解,亲测有效2 ...

  7. jeesite直接登录——真实破解

    前台 后台 @RequiresPermissions("alarm:alarm:view")一定要注释 —————————————————————————————————————— ...

  8. nginx 配置简单的静态页面

    nginx 文件服务配置,MIME和 default_type https://blog.csdn.net/qq_26711103/article/details/81116900 nginx 静态页 ...

  9. Spring的核心jar包

    Spring的主要jar包 四个核心jar包:beans.context.core.expression Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现Spring ...

  10. MySQL的基本操作一

    本文主要涉及到的SQL知识点包括CREATE创建数据库和表.INSERT插入数据.SUM()求和.GROUP BY分组.DATE_FORMAT()格式化日期.ORDER BY排序.COUNT()统计行 ...