zoukankan      html  css  js  c++  java
  • 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()是可以的

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

    无论如何,心平气和

  • 相关阅读:
    java构造方法和重写equals
    JVM,Java虚拟机基础知识新手入门教程(超级通熟易懂)
    ExtJS用Grid显示数据后如何自动选取第一条记录
    java 各种数据类型的互相转换
    提升思考力的8种日常训练法
    Java时间为什么从1970-01-01 00:00:00 000开始
    extjs计算两个DateField所间隔的月份(天数)
    如何快速理解他人代码,提高开发效率
    mybatis使用collection标签配置某个对象中的List集合类型的属性例子 <collection >
    将原有的Maven项目复制成另一个新名称的项目(包括:访问链接的时候也是使用的是新改的名称,而不是使用被复制项目的名称)
  • 原文地址:https://www.cnblogs.com/cfb513142804/p/7243222.html
Copyright © 2011-2022 走看看