標籤: JPA,API數據庫
該類用於獲取 EntityManagerFactory 實例。該類包含一個名爲 createEntityManagerFactory 的 靜態方法 。緩存
//建立EntityManagerFactory方法 String persistenceUnitName = "JAP-1"; //此處的名稱爲配置文件中的名稱 EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnitName);
主要用來建立 EntityManager 實例.該接口主要包含以下四個方法session
//建立EntityManager EntityManager manager = factory.createEntityManager();
在 JPA 規範中, EntityManager 是完成持久化操做的核心對象。實體做爲普通 Java 對象,只有在調用 EntityManager 將其持久化後纔會變成持久化對象。EntityManager 對象在一組實體類與底層數據源之間進行 O/R 映射的管理。它能夠用來管理和更新 Entity Bean, 根椐主鍵查找 Entity Bean, 還能夠經過JPQL語句查詢實體。ide
//開啓事務 EntityTransaction transaction = manager.getTransaction(); transaction.begin();
返回指定的 OID 對應的實體類對象,若是這個實體存在於當前的持久化環境,則返回一個被緩存的對象;不然會建立一個新的 Entity, 並加載數據庫中相關信息;若 OID 不存在於數據庫中,則返回一個 null。第一個參數爲被查詢的實體類類型,第二個參數爲待查找實體的主鍵值。測試
//相似於Hibernate中session 的find方法 @Test public void testFind() { Customer customer = manager.find(Customer.class,1); System.out.println("----------------------------"); System.out.println(customer); }
與find()方法相似,不一樣的是:若是緩存中不存在指定的 Entity, EntityManager 會建立一個 Entity 類的代理,可是不會當即加載數據庫中的信息,只有第一次真正使用此 Entity 的屬性才加載,因此若是此 OID 在數據庫不存在,getReference() 不會返回 null 值, 而是拋出EntityNotFoundException代理
//相似於Hibernate 中的 load 方法 @Test public void testGetReference(){ Customer customer = manager.getReference(Customer.class,1); System.out.println(customer.getClass().getName()); System.out.println("----------------------------"); System.out.println(customer); }
用於將新建立的 Entity 歸入到 EntityManager 的管理。該方法執行後,傳入 persist() 方法的 Entity 對象轉換成持久化狀態。
若是傳入 persist() 方法的 Entity 對象已經處於持久化狀態,則 persist() 方法什麼都不作。
若是對刪除狀態的 Entity 進行 persist() 操做,會轉換爲持久化狀態。
若是對遊離狀態的實體執行 persist() 操做,可能會在 persist() 方法拋出 EntityExistException(也有多是在flush或事務提交後拋出)code
/** * 相似於 Hibernate 的save 方法,使對象由臨時狀態變爲持久化狀態 * 不一樣之處:若對象有 Id 則不能執行 Insert 操做,而會拋出異常 */ @Test public void testPersistence(){ Customer customer = new Customer(); customer.setAge(12); customer.setEmail("123"); customer.setLastName("Tom"); customer.setCreateDate(new Date()); customer.setBirthday(new Date()); manager.persist(customer); System.out.println("Id=" + customer.getId()); }
刪除實例。若是實例是被管理的,即與數據庫實體記錄關聯,則同時會刪除關聯的數據庫記錄。xml
/** * 相似於 Hibernate 的delete 方法,把對象對應的記錄從數據庫刪除 * 在JPA中該方法只能刪除持久化對象,可是 Hibernate 不但能夠刪除持久化對象,還能夠刪除遊離對象 */ @Test public void testRemove(){ //此代碼會報錯,由於該方法只能移除持久化對象,不能移除遊離對象 // Customer customer = new Customer(); // customer.setId(3); //正確的方法 Customer customer =manager.find(Customer.class, 3); manager.remove(customer); }