JPA(三) JPA API初探

JPA(三) JPA API初探

標籤: JPA,API數據庫


Persistence 類

該類用於獲取 EntityManagerFactory 實例。該類包含一個名爲 createEntityManagerFactory 的 靜態方法 。緩存

  • createEntityManagerFactory 方法有以下兩個重載版本。
  • 帶有一個參數的方法以 JPA 配置文件 persistence.xml 中的持久化單元名爲參數
  • 帶有兩個參數的方法:前一個參數含義相同,後一個參數 Map類型,用於設置 JPA 的相關屬性,這時將忽略其它地方設置的屬性。Map 對象的屬性名必須是 JPA 實現庫提供商的名字空間約定的屬性名。代碼示例以下:
//建立EntityManagerFactory方法
    String persistenceUnitName = "JAP-1";  //此處的名稱爲配置文件中的名稱
    EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnitName);

EntityManagerFactory 接口

主要用來建立 EntityManager 實例.該接口主要包含以下四個方法session

  • createEntityManager():用於建立實體管理器對象實例。
  • createEntityManager(Map map):用於建立實體管理器對象實例的重載方法,Map 參數用於提供 EntityManager 的屬性。
  • isOpen():檢查 EntityManagerFactory 是否處於打開狀態。實體管理器工廠建立後一直處於打開狀態,除非調用close()方法將其關閉。
  • close():關閉 EntityManagerFactory 。 EntityManagerFactory 關閉後將釋放全部資源,
    isOpen()方法測試將返回 false,其它方法將不能調用,不然將致使IllegalStateException異常。
//建立EntityManager  
    EntityManager manager = factory.createEntityManager();

EntityManager

在 JPA 規範中, EntityManager 是完成持久化操做的核心對象。實體做爲普通 Java 對象,只有在調用 EntityManager 將其持久化後纔會變成持久化對象。EntityManager 對象在一組實體類與底層數據源之間進行 O/R 映射的管理。它能夠用來管理和更新 Entity Bean, 根椐主鍵查找 Entity Bean, 還能夠經過JPQL語句查詢實體。ide

//開啓事務
    EntityTransaction transaction = manager.getTransaction();
    transaction.begin();

find(Class<T> entityClass,Object primaryKey) 方法

返回指定的 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);
  }

getReference (Class<T> entityClass,Object primaryKey) 方法

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

persist (Object entity) 方法

用於將新建立的 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());
  }

remove (Object entity) 方法

刪除實例。若是實例是被管理的,即與數據庫實體記錄關聯,則同時會刪除關聯的數據庫記錄。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);
  }
相關文章
相關標籤/搜索