EntityManager对象的merge()方法

merge (T entity):merge()

用于处理 Entity 的同步。即数据库的插入和更新操作,这个操作有4种处理过程,我这里就分别记录一下。
(1)当保存的是一个瞬时状态的对象(没有id)

  • 那么会创建一个新的对象,将瞬时状态的属性复制给新的对象,
  • 然后持久化这个新的对象,并且返回这个持久话对象的引用。
  • 该持久化对象包含id
    //如果是瞬间时状态,
    // 那么会创建一个新的对象,将瞬时状态的属性复制给新的对象,
    // 然后持久化这个新的对象,并且返回这个持久话对象的引用。
    // 该持久化对象包含id
    @Test
    public void testmerge1(){
        //创建EntityManagerFactory
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa");

        //创建EntityManager对象
        EntityManager entityManager = entityManagerFactory.createEntityManager();

        // 获得并且开启事物
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();

        Student student = new Student();
        student.setBirth(new Date());
        student.setName("bbb");
        student.setEmail("213@qq.com");
        student.setAge(12);

        Student merge = entityManager.merge(student);
        System.out.println(merge.getId());


        //提交事务
        transaction.commit();

        //关闭EntityManager对象
        entityManager.close();

        //关闭EntityManagerFactory
        entityManagerFactory.close();

    }

(2)如果保存的是一个有ID的游离状态的对象,并且上下文session缓存中,和数据库当中都没有 与它id相同的对象。

  • 1.创建一个新的对象
  • 2.将改游离对象的属性复制给新对象
  • 3.持久化该新创建的对象
  • 4.返回持久化对象的索引
  @Test
    public void testmerge2(){
        //创建EntityManagerFactory
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa");

        //创建EntityManager对象
        EntityManager entityManager = entityManagerFactory.createEntityManager();

        // 获得并且开启事物
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();


        Student student = new Student();
        student.setBirth(new Date());
        student.setName("bbb");
        student.setEmail("213@qq.com");
        student.setAge(12);
        //数据库没有改id的持久化对象
        student.setId(100);

        Student merge = entityManager.merge(student);
        System.out.println("========================");
        System.out.println(merge.getId());

        //提交事务
        transaction.commit();

        //关闭EntityManager对象
        entityManager.close();

        //关闭EntityManagerFactory
        entityManagerFactory.close();
    }

在这里插入图片描述
输出结果: 12 (并不是我们游离对象所拥有id的值100)

(3) 如果是拥有id的游离对象,并且session缓存中没有 但数据库中有与之id相同的持久化对象。

  • 1.将数据库该id的持久化对象查询出来
  • 2.将改游离对象的属性复制给数据库查询出来的持久化对象
  • 3.执行update 操作,将改持久化对象更新到数据库
  • 4.返回持久化对象的索引
    @Test
    public void testmerge3(){
        //创建EntityManagerFactory
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa");

        //创建EntityManager对象
        EntityManager entityManager = entityManagerFactory.createEntityManager();

        // 获得并且开启事物
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();

        Student student = new Student();
        student.setBirth(new Date());
        student.setName("cc");
        student.setEmail("11111111@qq.com");
        student.setAge(12);
        //数据库有id的持久化对象
        student.setId(12);


        Student merge = entityManager.merge(student);

        //提交事务
        transaction.commit();

        //关闭EntityManager对象
        entityManager.close();

        //关闭EntityManagerFactory
        entityManagerFactory.close();
    }

在这里插入图片描述
看到控制台发送了两条sql,一条是查询,一条是update更新操作。

(4) 如果是拥有id的游离对象,并且session缓存中有

1.将改游离对象的属性复制到缓存当中的持久化对象中
2.执行update 操作,将改持久化对象更新到数据库
3.返回持久化对象的索引

  @Test
    public void testmerge4(){
        //创建EntityManagerFactory
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa");

        //创建EntityManager对象
        EntityManager entityManager = entityManagerFactory.createEntityManager();

        // 获得并且开启事物
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();

        Student student = new Student();
        student.setBirth(new Date());
        student.setName("jj");
        student.setEmail("55555555@qq.com");
        student.setAge(12);
        //数据库有id的持久化对象
        student.setId(12);

        //使得session上下当中,拥有该对象
        Student sessionStudent = entityManager.find(Student.class, 12);

        Student merge = entityManager.merge(student);

        //输出结果为true,说明是游离对象的值,复制给sessionstudent,然后将该持久化对象,
        // update到数据当中,返回的索引就是session当中的对象
        System.out.println(merge==sessionStudent);

        //提交事务
        transaction.commit();

        //关闭EntityManager对象
        entityManager.close();

        //关闭EntityManagerFactory
        entityManagerFactory.close();


    }

输出结果为true,说明是游离对象的值,复制给sessionstudent,然后将该持久化对象,update到数据当中,返回的索引就是session当中的对象。
总结:
简略画了一个图,来记录一下执行过程:
在这里插入图片描述

后记:坚持记录学习的点点滴滴…

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值