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. *** 没有规则可以创建目标“test”。 停止。

    在编译Linux模块时出现这个问题,在仔细检查了Makefile没有错误后,重名了了该源程序和Makefile所在文件夹的名字,与源程序名字一致,然后问题就消失了!它们的关联体现在哪啊!?

  2. linux环境下Python搭建

    安装gcc   yum install gcc 安装zlib   yum -y install zlib* 安装openssl-devel   yum install openssl-devel -y ...

  3. 流程控制之 while 循环

    目录 流程控制之while while 条件循环语句 while contine while else while 循环的嵌套 流程控制之while while 条件循环语句 循环就是一个重复的过程 ...

  4. Web 开发和数据科学家仍是 Python 开发的两大主力

    由于 Python 2 即将退役,使用 Python 3 的开发者大约为 90%,Python 2 的使用量正在迅速减少.而去年仍有 1/4 的人使用 Python 2. Web 开发和数据科学家仍是 ...

  5. 【题解】P3391 文艺平衡树

    用pb_ds库中的rope水过去的,忽然发现这玩意能水好多模拟题. 详见这个博客:背景的小姐姐真的好看 声明 #include <ext/rope> using namespace __g ...

  6. [转载]Yacc基础

    原文:https://www.ibm.com/developerworks/cn/linux/sdk/lex/index.html,摘录部分内容. Yacc的定义 Yacc 代表 Yet Anothe ...

  7. python检测域名

    pip install python-whois import whois print(whois.whois('baidu.com')) #输出有关baidu.com的所有域名

  8. Arduino Nano与SIM800C 通信

    首先感谢 原文作者:https://blog.csdn.net/weixin_44481398/article/details/86596933#commentBox 找了好久没有找到,使用他的代码一 ...

  9. webpack配置不同打包配置

    生成环境与开发环境打包配置 使用package.json配置npm run开启不同的打包配置 ...webpack基本使用最后一篇博客 在上一篇博客中详细的演示了webpack开启本地服务和热更新,这 ...

  10. Java是面向对象的编程语言。它不仅吸收了C++语言的优点

    Java是面向对象的编程语言.它不仅吸收了C++语言的优点,而且摒弃了C++中难于理解的多继承和指针的概念.因此,Java语言具有功能强大.使用方便的特点.Java语言作为静态面向对象的编程语言的代表 ...