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