1. 程式人生 > >JPA——初識JPA

JPA——初識JPA

1.什麼是JPA:

Java Persistence API:用於物件持久化的API。

Java EE 5.0平臺標準的ORM規範,使得應用程式以統一的方式訪問持久層。

JPA是hibernate的一個抽象(就像JDBC和JDBC驅動的關係):

--JPA是規範:JPA本質上是一種ORM規範,不是ORM框架——因為JPA並沒有提供ORM實現,它只是定製了一些規範,,提供了一些程式設計的API介面,但具體實現則由ORM廠商提供實現。

--Hibernate是實現:Hibernate除了作為ORM框架之外,它也是一種JPA實現。

從功能上說,JPA是Hibernate功能的一個子集。

JPA的目標之一是制定一個可以由很多供應商實現的API,目前Hibernate3.2+、TopLink10.1+以及OpenJPA都提供了JPA的實現。

--Hibernate:JPA的始作俑者就是Hibernate的作者,Hibernate從3.2開始支援JPA。

--TopLink:以前需要收費,現在也是開源的。

--OpenJPA:是Apache組織提供的開源專案。

JPA主要包括3方面的技術:

--ORM對映元資料:支援XML和JDK 5.0註解兩種元資料的形式,元資料描述物件和表之間的對映關係,框架據此將實體物件持久化到資料庫表中。

--JPA的API:用來操作實體物件,執行CRUD操作,框架在後臺完成所有的事情,開發者從繁瑣的JDBC和SQL程式碼中解脫出來。

--查詢語言(JPQL):這是持久化操作中最重要的方面,通過面向物件而非面向資料庫的查詢語言查詢資料,避免程式和具體的SQL緊密耦合。

2.使用JPA持久化物件的步驟:

--建立persistence.xml,在這個檔案中配置持久化單元。

----需要指定跟哪個資料庫進行互動。

----需要指定使用哪個持久化的框架以及配置該框架的基本屬性

--建立實體類,使用annotation來描述實體類和資料庫表之間的對映關係。

--使用JPA API完成資料的增刪改查的操作。

----建立EntityManagerFactory(對應Hibernate中的SessionFactory)。

----建立EntityManager(對應Hibernate中的Session)。

在使用JPA+Hibernate時候需要匯入以下jar包:

3.JPA實踐:

在實踐過程中最重要的就是persistence.xml的路徑問題,在一般的Java專案中,persistence.xml需要放在src/META-TNF下面。

接下來就是persistence.xml的基本配置,下面是關於連線oracle的配置:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <!--transaction-type表示事務狀態,分別有本地事務RESOURCE_LOCAL和分散式事務JTA-->
    <persistence-unit name="jpa-1" transaction-type="RESOURCE_LOCAL">
        <!--
        配置使用什麼ORM產品來作為JPA的實現
        1.實際上配置的是 javax.persistence.spi.PersistenceProvider介面的實現類
        2.若JPA專案中只有一個JPA的實現產品則也可以不配置該節點
        -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <!--連線資料庫的基本資訊-->
            <property name="hibernate.connection.driver_class" value="xxx"/>
            <property name="hibernate.connection.url" value="xxx"/>
            <property name="hibernate.connection.username" value="xxx"/>
            <property name="hibernate.connection.password" value="xxx"/>
            <!--配置JPA實現產品的基本資訊,配置hibernate的基本屬性-->
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.show_sql" value="true"/>
            <!--作用主要用於:自動建立|更新|驗證資料庫表結構。如果不是此方面的需求建議set value="none"-->
            <!--create:-->
            <!--每次載入hibernate時都會刪除上一次的生成的表,然後根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致資料庫表資料丟失的一個重要原因。-->
            <!--create-drop :-->
            <!--每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。-->
            <!--update:-->
            <!--最常用的屬性,第一次載入hibernate時根據model類會自動建立起表的結構(前提是先建立好資料庫),以後載入hibernate時根據 model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等 應用第一次執行起來後才會。-->
            <!--validate :-->
            <!--每次載入hibernate時,驗證建立資料庫表結構,只會和資料庫中的表進行比較,不會建立新表,但是會插入新值。-->
            <property name="hibernate.hbm2ddl.auto" value="none"/>
        </properties>
    </persistence-unit>
</persistence>

然後就是基本的連線操作:

public class Main {

    public static void main(String[] args){
        //1.建立EntityManagerFactory
        EntityManagerFactory entityManagerFactory =
                Persistence.createEntityManagerFactory("jpa-1");
        //2.建立EntityManager
        EntityManager entityManager =
                entityManagerFactory.createEntityManager();
        //3.開啟事務
        EntityTransaction entityTransaction =
                entityManager.getTransaction();
        entityTransaction.begin();
        //4.進行持久化操作
        String sql = "xxxxxx";
        Query query = entityManager.createNativeQuery(sql);
        List<String> list = query.getResultList();
        System.out.println(list.get(0).toString());
        //5.提交事務
        entityTransaction.commit();
        //6.關閉EntityManager
        entityManager.close();
        //7.關閉EntityManagerFactory
        entityManagerFactory.close();
    }
}