JPA中entityManager的CRUD


 
 

private EntityManagerFactory entityManagerFactory;
private EntityManager entityManager;
private EntityTransaction transaction;

@Before
public void init(){
entityManagerFactory = Persistence.createEntityManagerFactory("jpa-1");
entityManager = entityManagerFactory.createEntityManager();
transaction = entityManager.getTransaction();
transaction.begin();
}

@After
public void destroy(){
transaction.commit();
entityManager.close();
entityManagerFactory.close();
}

//若传入的是一个游离对象, 即传入的对象有 OID. 
    //1. 若在 EntityManager 缓存中有对应的对象
    //2. JPA 会把游离对象的属性复制到查询到EntityManager 缓存中的对象中.
    //3. EntityManager 缓存中的对象执行 UPDATE. 
    @Test
    public void testMerge4(){
        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(4);
        Customer customer2 = entityManager.find(Customer.class, 4);
        
        entityManager.merge(customer);
        
        System.out.println(customer == customer2); //false
    }
    
    //若传入的是一个游离对象, 即传入的对象有 OID. 
    //1. 若在 EntityManager 缓存中没有该对象
    //2. 若在数据库中也有对应的记录
    //3. JPA 会查询对应的记录, 然后返回该记录对一个的对象, 再然后会把游离对象的属性复制到查询到的对象中.
    //4. 对查询到的对象执行 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
    }
    
    //若传入的是一个游离对象, 即传入的对象有 ID. 
    //1. 若在 EntityManager 缓存中没有该对象
    //2. 若在数据库中也没有对应的记录
    //3. JPA 会创建一个新的对象, 然后把当前游离对象的属性复制到新创建的对象中
    //4. 对新创建的对象执行 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);//如果数据库中没有这个id,则插入操作,这个id会被覆盖掉
                            //customer#id:100
                            //customer2#id:5
        Customer customer2 = entityManager.merge(customer);
        
        System.out.println("customer#id:" + customer.getId());
        System.out.println("customer2#id:" + customer2.getId());
    }
    
    /**
     * 总的来说: 类似于 hibernate Session 的 saveOrUpdate 方法.
     * 
     * 对象没有id,插入操作
     * 对象有id,且和数据库中有对应的id,修改操作
     * 对象有id,但数据库中找不到对应的id,则抛弃id,进行插入操作
     */
    //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("CCccc");
        //customer.setId(3);
        Customer customer2 = entityManager.merge(customer);
        
        System.out.println("customer#id:" + customer.getId());
        System.out.println("customer2#id:" + customer2.getId());
    }
    
    //类似于 hibernate 中 Session 的 delete 方法. 把对象对应的记录从数据库中移除
    //但注意: 该方法只能移除 持久化 对象. 而 hibernate 的 delete 方法实际上还可以移除 游离对象.
    @Test
    public void testRemove(){
//        Customer customer = new Customer();
//        customer.setId(2);//游离对象不可移除,会出错
        
        Customer customer = entityManager.find(Customer.class, 2);
        entityManager.remove(customer);
    }
    
    //类似于 hibernate 的 save 方法. 使对象由临时状态变为持久化状态. 
    //和 hibernate 的 save 方法的不同之处: 若对象有 id, 则不能执行 insert 操作, 而会抛出异常. 
    @Test
    public void testPersistence(){
        Customer customer = new Customer();
        customer.setAge(15);
        customer.setBirth(new Date());
        customer.setCreatedTime(new Date());
        customer.setEmail("bb@163.com");
        customer.setLastName("BB");
//        customer.setId(100);//有id,不执行
        
        entityManager.persist(customer);
        System.out.println(customer.getId());
    }
    
    
    
    //类似于 hibernate 中 Session 的 load 方法,懒加载,用到时才查询
    @Test
    public void testGetReference(){
        Customer customer = entityManager.getReference(Customer.class, 1);
        System.out.println(customer.getClass().getName());
        
        System.out.println("-------------------------------------");
//        transaction.commit();
//        entityManager.close();
        
        System.out.println(customer);
    }
    
    
    
    //类似于 hibernate 中 Session 的 get 方法. 
    @Test
    public void testFind() {
        //entityManager.find(Class<T> arg0, Object arg1);
        Customer customer = entityManager.find(Customer.class, 1);
        System.out.println("-------------------------------------");
        
        System.out.println(customer);
    }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM