天天看點

JPA開發總結<一>

什麼是JPA

JPA(Java Persistence API)是Sun官方提出的Java持久化規範,它為Java開發人員提供了一種對象/關系映射工具來管理Java應用中的關系資料。它的出現主要是為了簡化現有的持久化開發工作和整合ORM技術,結束現在HIbernate、TopLink、JDO等ORM架構各自為營的局面。值得注意的是,JPA是在充分吸收了現有HIbernate、TopLink、JDO等ORM架構的基礎上發展而來的(JPA的開發就是Hibernate的創始人做的),具有易于使用、伸縮性強等優點,從目前的開發社群的反應上看,JPA收到了極大地支援和贊揚,其中就包括了Spring與EJB3.0的開發團隊。着眼未來幾年的技術走向,JPA作為ORM領域标準化整合者應該不難實作,現有的雲計算架構就需要JPA整合,因為各個大公司的産品資料庫操作不盡相同,正需要這種規範。

JPA的總體思想和現有的HIbernate、TopLink、JDO等ORM架構大體一緻。

總的來說,JPA包括3個方面(之前文章也多少提過):

1、ORM映射中繼資料

JPA支援XML和JDK5.0注釋或者稱注解兩種中繼資料的形式,中繼資料描述對象和表之間的映射關系,架構據此将實體對象持久化資料庫中。

2、Java持久化API

用來操作實體對象,執行CRUD操作,架構在背景替我們完成所有的事情,開發者可以從繁瑣的JDBC和SQL代碼中解脫出來。

3、查詢語言

這是持久化操作中很重要的一個方面,通過面向對象而非面向資料庫的查詢語言查詢資料,避免程式的SQL語句緊密耦合。

這裡提示一下:JPA不是一種新的ORM架構,它的出現隻是用于規範現有的ORM技術,他不能取代現有的HIbernate、TopLink、JDO等ORM架構。相反,在JPA開發時,我們仍将使用這些ORM架構,知識此時開發出來的應用不在依賴于某一個持久化提供商(實作了JPA規範的架構都是它的産品,包括HIbernate)。應用可以在不修改代碼的情況下在任何JPA環境下運作,真正做到低耦合,可擴充的程式設計。

以實作JPA的HIbernate開發為例

這次執行個體一部分代碼我将放在常用工具類中,友善以後直接使用,同時,ORM映射我采用注解方式來做,XML配置自己開發項目使用的太多,是時候換種新的技術實作。

首先是開發JPA依賴的jar包,我把14個常用的jar包上傳到了我的資源了,感興趣的同學自己下載下傳吧,然後就是建立java project項目,JPA規範要求在類路徑下的META-INF目錄下放置persistence.xml,而且檔案名稱是固定的,配置模闆如下:

<persistence 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_1_0.xsd"
   version="1.0">
   <!-- 持久化單元名字name=jpatest1 -->
   <persistence-unit name="jpatest1" transaction-type="RESOURCE_LOCAL">
      <properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
			<property name="hibernate.max_fetch_depth" value="3" />
			<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/>
			<property name="hibernate.connection.username" value="root" />
			<property name="hibernate.connection.password" value="123456" />
			<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.format_sql" value="true" />
		</properties>
   </persistence-unit>
</persistence>
           

項目開發我們常用的兩種開發方式(我們支援後者)

1.先建表,後再根據表來配置編寫配置檔案和實體bean,使用這種方案的開發人員受到了傳統資料庫模組化的影響,也是大部分人員使用的,但不夠oop

2.先編寫配置檔案和實體bean,然後在生成表,使用這種方案的開發人員采用的是領域模組化思想,這種思想相對前一種思想更加oop,但新手來說容易出問題。

persistence.xml中事務配置:

我們知道事務有兩種(transaction-type):本地事務(RESOURCE_LOCAL)和全局事務(JTA)

一般我們都是使用本地事務,那什麼時候使用全局事務那,就是當對兩個連接配接或者對象同時操作時,需要使用,看下面這個例子,1銀行要向2銀行轉賬,這就涉及到1銀行的減操作,2銀行的加操作:

1.mysql  2.oracle

轉賬

1>update mysql set amount=amount-xx where id=xxx(mysql);

1>update mysql set amount=amount+xx where id=yyy(oracle);

但問題在于我們建立兩個連接配接connnection,那上面的兩條語句分别在不同連接配接中執行,怎麼控制送出,以及如何判斷送出結果,這就要求必須使用全局事務。

全局事務的API是由JTA提供的,看代碼如何實作,

JTA.getUserTransation().begin();

connection = mysql;

connection2 = oracle;

connection->update mysql set amount=amount-xx where id=xxx(mysql);

connection2->update mysql set amount=amount+xx where id=yyy(oracle);

JTA.getUserTransation().summit();

在這期間,用到二次送出協定,簡單的說,就是執行第一條語句時,它會先預送出到資料庫,将送出傳回的booblean型資料存入list,然後隻有在全為true時,才會全局送出,如果其中任意一條出現false,事務都不會真正送出,而是復原資料,将資料恢複到原來狀态。

下面的具體開發代碼我将另開文章詳解介紹,内容解釋就到這了。