JPA学习02

滴水穿石

使用单元测试

private EntityManagerFactory enFactory = null;
    private EntityManager entityManager = null;
    private EntityTransaction transaction = null;
    
    @Before
    public void init(){
        //1.创建EntityManagerFactory
        String persistenceUnitName = "Jpa01";
        enFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
        //2.创建EntityManager
        entityManager = enFactory.createEntityManager();
        //3.开启事务
        transaction = entityManager.getTransaction();
        transaction.begin();
    }
    
    @After
    public void destory(){
        //5.提交事务
        transaction.commit();
        //6.关闭EntityManager
        entityManager.close();
        //7.关闭EntityManagerFactory
        enFactory.close();
    }

Merge()方法测试01————临时对象

@Test
    public void testMerge1() {
        
        Customer customer = new Customer();
        customer.setAge(11);
        customer.setEmail("111@cfb.com");
        customer.setName("aaa");
        
        Customer customer2 = entityManager.merge(customer);
        
        System.out.println("customer # id = " + customer.getId());

        System.out.println("customer2 # id = " + customer2.getId());
    }

传入的对象没有ID,即为临时对象

若传入的是一个临时对象,

会创建一个新的对象,把临时对象的属性复制到新对象中,然后对新对象执行持久化操作。

所以新对象中有Id,但以前的临时对象中没有ID

 Merge()方法测试02————游离对象

EntityManager缓存中不存在,数据库中也不存在的游离对象

@Test
    public void testMerge2() {
        
        Customer customer = new Customer();
        customer.setAge(11);
        customer.setEmail("111@cfb.com");
        customer.setName("aaa");
        customer.setId(100);
        Customer customer2 = entityManager.merge(customer);
        
        System.out.println("customer # id = " + customer.getId());

        System.out.println("customer2 # id = " + customer2.getId());
    }

游离对象,即对象有ID

1.若在EntityManager缓存中没有该对象

2.若在数据库中也没有对应的记录

3.JPA会创建一个新的对象,把当前的游离对象属性复制到新创建的对象中

4.对新创建的对象执行Insert()操作

EntityManager缓存中不存在,数据库中存在的游离对象

@Test
    public void testMerge3() {
        
        Customer customer = new Customer();
        customer.setAge(11);
        customer.setEmail("xxx@cfb.com");
        customer.setName("aaa");
        customer.setId(4);
        Customer customer2 = entityManager.merge(customer);
        
        System.out.println("customer # id = " + customer.getId());

        System.out.println("customer2 # id = " + customer2.getId());
    }

1.若传入的是一个游离对象

2.在EntityManager缓存中没有该对象

3.在数据库中有该对象

4.JPA会查询对应的记录,然后返回该记录对应的对象,再然后把游离对象的属性复制到查询到的对象中

5.对查询到的对象执行update操作

EntityManager缓存中存在,数据库中也存在的游离对象

@Test
    public void testMerge4() {
        
        Customer customer = new Customer();
        customer.setAge(11);
        customer.setEmail("xxx@cfb.com");
        customer.setName("aaa");
        customer.setId(4);
        Customer customer2 = entityManager.find(Customer.class, 4);
                
        Customer customer3 = entityManager.merge(customer);
        
        System.out.println("customer # id = " + customer.getId());

        System.out.println("customer2 # id = " + customer2.getId());
        
        System.out.println("customer3 # id = " + customer3.getId());
    }

1.EntityManager缓存中存在对象

2.JPA会把游离对象的属性复制到查询到EntityManager缓存中的对象中

3.EntityManager缓存中的对象执行Update()操作

总结:

1.临时对象

2.游离对象

  2.1 EntityManager缓存中没有,数据库没有

  2.2 EntityManager缓存中没有,数据库中有

  2.3 EntityManager缓存中有,数据库中有

Hibernate的操作不允许session同时操作两个ID相同的游离对象,JPA的merge()是可以的

—————————————————————————————————————————————————————————————————————————

无论如何,心平气和

原文地址:https://www.cnblogs.com/cfb513142804/p/7243222.html