EntityManager对象的merge()方法

    xiaoxiao2022-07-12  133

    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当中的对象。 总结: 简略画了一个图,来记录一下执行过程:

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

    最新回复(0)