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. PAT A1035 Password (20)

    AC代码 注意创造函数条件中使用引用 输出语句注意单复数 #include <cstdio> #include <cstring> #include <iostream& ...

  2. Yii2.0 queue

    https://www.yiichina.com/tutorial/1635 https://my.oschina.net/gcdong/blog/3031113 https://www.yii-ch ...

  3. PC端判断屏幕宽度到达手机宽度的时候,直接跳转手机页面

    <script> // //判断屏幕宽度到达手机宽度的时候,直接跳转手机页面 // window.addEventListener("resize", function ...

  4. Mysql-Sqlalchemy-ORM-多外键关联

    创建表结构:orm_many_fk.py from sqlalchemy import Integer, ForeignKey, String, Column,create_engine from s ...

  5. 数值优化(Numerical Optimization)学习系列-无梯度优化(Derivative-Free Optimization)

    数值优化(Numerical Optimization)学习系列-无梯度优化(Derivative-Free Optimization) 2015年12月27日 18:51:19 下一步 阅读数 43 ...

  6. L1-025. 正整数A+B 简单复习一下,。

    本题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空格分开.问题是A和B不一定是满 ...

  7. 浅谈JMX

    JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构.设计模式.应用程序接口以及服务.通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存.重新加载配置文件等 优点是可 ...

  8. Cookie工具类(获取cookie,设置cookie)

    import java.io.UnsupportedEncodingException; import java.net.URLDecoder;import java.net.URLEncoder; ...

  9. 阿里云环境中配置tomcat7可能出现的问题及解决方法

    前提是安装好了tomcat,但是输入ip+端口无法访问,那么情况有一下几种 (1)可能防火墙没有关闭 systemctl stop firewalld.service #停止firewall syst ...

  10. R安装包的问题

    package 'tswge' is not available (for R version 3.5.1) install.packages('tswge', repos="http:// ...