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