import
  
  
   javax.persistence.EntityManager;
  
  
   import
  
  
   javax.persistence.EntityManagerFactory;
  
  
   import
  
  
   javax.persistence.EntityTransaction;
  
  
   import
  
  
   javax.persistence.Persistence;
  
  
   import
  
  
   java.util.Date;
  
  
   public
  
  
   class
  
  
   MergeTest {
  
  
   private
  
  
   EntityManagerFactory entityManagerFactory;
  
  
   private
  
  
   EntityManager entityManager;
  
  
   private
  
  
   EntityTransaction transaction;
    @Before
  
  
   public
  
  
   void
  
  
   init() {
        entityManagerFactory
  
  = Persistence.createEntityManagerFactory("jpaname"
  
   );
        entityManager
  
  =
  
   entityManagerFactory.createEntityManager();
        transaction
  
  =
  
   entityManager.getTransaction();
        transaction.begin();
    @After
  
  
   public
  
  
   void
  
  
   destroy() {
        transaction.commit();
        entityManager.close();
        entityManagerFactory.close();
  
  
   //
  
  
   1. 若传入的是一个临时对象
  
  
   //
  
  
   会创建一个新的对象, 把临时对象的属性复制到新的对象中, 然后对新的对象执行持久化操作
  
  
   //
  
  
   所以新的对象中有 id, 但以前的临时对象中没有 id
  
  
   @Test
  
  
   public
  
  
   void
  
  
   testMerge1() {
        Customer customer
  
  =
  
   new
  
  
   Customer();
        customer.setAge(
  
  18
  
   );
        customer.setBirth(
  
  
   new
  
  
   Date());
        customer.setCreatedTime(
  
  
   new
  
  
   Date());
        customer.setEmail(
  
  "cc@163.com"
  
   );
        customer.setLastName(
  
  "CC"
  
   );
        Customer customer2
  
  =
  
   entityManager.merge(customer);
        System.out.println(
  
  "customer#id:" +
  
   customer.getId());
        System.out.println(
  
  "customer2#id:" +
  
   customer2.getId());
   
    2.若传入的是一个游离对象, 即传入的对象有 OID
   
   // 2.若传入的是一个游离对象, 即传入的对象有 OID
// 若在 EntityManager 缓存中没有该对象
// 若在数据库中也没有对应的记录
// JPA 会创建一个新的对象, 然后把当前游离对象的属性复制到新创建的对象中
// 对新创建的对象执行 insert 操作
@Test
public void testMerge2() {
    Customer customer = new Customer();
    customer.setAge(18);
    customer.setBirth(new Date());
    customer.setCreatedTime(new Date());
    customer.setEmail("dd@163.com");
    customer.setLastName("DD");
    customer.setId(100);
    Customer customer2 = entityManager.merge(customer);
    System.out.println("customer#id:" + customer.getId());
    System.out.println("customer2#id:" + customer2.getId());
 3.若传入的是一个游离对象, 即传入的对象有 OID,在数据库中有对应的记录
// 3.若传入的是一个游离对象, 即传入的对象有 OID,在数据库中有对应的记录
// 在 EntityManager 缓存中没有该对象
// JPA 会查询对应的记录, 然后返回该记录对一个的对象, 再然后会把游离对象的属性复制到查询到的对象中
// 对查询到的对象执行 update 操作
@Test
public void testMerge3(){
    Customer customer = new Customer();
    customer.setAge(18);
    customer.setBirth(new Date());
    customer.setCreatedTime(new Date());
    customer.setEmail("ee@163.com");
    customer.setLastName("EE");
    customer.setId(4);
    Customer customer2 = entityManager.merge(customer);
    System.out.println(customer == customer2); //false
4.若传入的是一个游离对象, 即传入的对象有 OID,在 EntityManager 缓存中有对应的对象
// 4.若传入的是一个游离对象, 即传入的对象有 OID,在 EntityManager 缓存中有对应的对象
// JPA 会把游离对象的属性复制到查询到 EntityManager 缓存中的对象中
// EntityManager 缓存中的对象执行 UPDATE
@Test
public void testMerge4(){
    Customer customer = new Customer();
    customer.setAge(18);
    customer.setBirth(new Date());
    customer.setCreatedTime(new Date());
    customer.setEmail("dds@163.com");
    customer.setLastName("DD");
    customer.setId(4);
    Customer customer2 = entityManager.find(Customer.class, 4);
    entityManager.merge(customer);
    System.out.println(customer == customer2); //false