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); }