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