testProvider()測試方法檢驗這個服務是否為JPA提供者的包含提供者邏輯名的 EntityManager的實現(xiàn)返回了一個類名。另一個測試方法檢驗服務返回的Message實例是否擁有提供者分配的正確身份。
構建JPA應用程序和切換提供者的Ant 腳本
在運行代碼之前,后一步是使用Ant編寫的構建腳本。
我們需要使這個腳本編譯Java類,將它們封裝至EJB模塊和EAR中,然后在 Weblogic Server上部署和撤除它們,并運行 JUnit測試。
由于在切換提供者的時候會有些細微的變化,所以使得這種例行任務的標準構建文件有些復雜。每個提供者使用persistence.xml都有所不同。單獨的配置文件位于META-INF/hibernate和META-INF/kodo中,構建腳本負責在可部署的包中包含正確的配置。同樣,構建腳本使用提供者的邏輯名(例如,hibernate-ejb.jar、kodo-ejb.jar或openjpa-ejb.jar)創(chuàng)建EJB模塊。
構建的另一個重要的方面是OpenJPA 和Kodo都要求一個編譯后增強的步驟?梢允褂–javaagent將這個編譯后的步驟放到運行時,但是我更愿意用構建腳本進行增強,而不是用–javaagent請求Weblogic server。您可以在 OpenJPA用戶手冊中獲得有關增強的更多內(nèi)容。
build.xml中將含有一個<target name="check-provider">。
將通過有效的提供者名稱調(diào)用這個構建腳本
$ ant -Dprovider=hibernate
hibernate、kodo和openjpa都是有效的提供者值。
默認的構建目標將清理、編譯、有條件地增強、封裝和撤除先前的部署(如果有的話),并且部署、運行測試和報告錯誤(如果有的話)。
通過build.properties文件您指定 ${bea.home}和用戶憑證等作為您的環(huán)境配置腳本。
為了進行部署,構建腳本用以下內(nèi)容封裝了JPAService.ear:
$ jar tvf JPAService.ear
106 Sat Jun 23 01:33:00 CDT 2007 META-INF/MANIFEST.MF
414 Sat Jun 23 01:33:02 CDT 2007 META-INF/application.xml
2755 Sat Jun 23 01:33:02 CDT 2007 hibernate-ejb.jar
在JEE歷史上,簡單的Enterprise Application Archive有一個單獨的EJB模塊,如以下的application.xml 所示(為便于可讀性,并未包含的XML頭部和命名空間聲明):
<application>
<display-name>EJB3 Sample Application</display-name>
<module>
<ejb>hibernate-ejb.jar</ejb>
</module>
</application>
EJB模塊hibernate-ejb.jar看上去不錯吧?
$ jar tvf hibernate-ejb.jar
106 Sat Jun 23 01:33:00 CDT 2007?META-INF/MANIFEST.MF
1280 Sat Jun 23 01:33:02 CDT 2007 META-INF/persistence.xml
662 Fri Jun 22 02:31:58 CDT 2007?META-INF/weblogic-ejb-jar.xml
169 Sat Jun 23 01:33:02 CDT 2007?service/JPAService.class
888 Sat Jun 23 01:33:02 CDT 2007?service/Message.class
839 Sat Jun 23 01:33:02 CDT 2007?session/JPAServiceBean.class
這個EJB模塊包含服務接口、會話bean實現(xiàn)和持久性實體類。Jar還有兩個配置文件:用于持久性配置的persistence.xml和用于在Weblogic Server中配置會話bean的weblogic-ejb-jar.xml。這些文件必須能作為META-INF/persistence.xml和META-INF/weblogic-ejb-jar.xml的資源被活動的類裝載器加載。
配置Hibernate持久性單元
JPA提供者通過persistence.xml配置特定的持久性單元。在這個文件中,需要提供以下內(nèi)容:
持久性單元的名稱
支持的事務類型;選項是RESOURCE_LOCAL和JTA
提供者的類名
持久性Java類名列表或者一個包含了它們的Jar文件。您可以不定義它們,但好別這樣——這個問題不在我們當前的討論范圍之內(nèi)
映射文件的名稱,如果您認為O-R映射注釋違反了POJO的本性
將要使用的數(shù)據(jù)庫。在一個容器環(huán)境中,您可以指定一個JTA或非JTA數(shù)據(jù)源的名稱,數(shù)據(jù)源是通過其他方式配置的。此外,您也可以分別指定url、用戶憑證和驅(qū)動類名稱(這也是我們將在這里采用的方法)。
除此之外,每個提供者還支持許多可配置的屬性。如我們將看到的那樣,要成功地使用 O-R映射,要了解這些參數(shù)的意義,而且更重要的是知道在哪里應用它們。XML的persistence.xml控制模式允許通過<property name="a.b.c" value="xyz"/>標記指定特定于提供者的屬性。不同的提供者使用不同的屬性名稱,即使它們意義相同。因此,當我們需要從一個提供者向另一個提供者切換應用程序的時候,這些屬性成為至關重要的因素。
通過Google進行了一次快速的搜索之后,我配置了Hibernate的persistence.xml,具體如下
persistence.xml
<?xml version="1.0"?>
<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">
<persistence-unit name="test">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>service.Message</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost/hibernateDB"/>
</persistence>
?<provider>指定為org.hibernate.ejb.HibernatePersistence。同樣,配置Hibernate以url的方式使用MySQL,即jdbc:mysql://localhost/hibernateDB。
在Weblogic Server上安裝Hibernate