這是TrailBlazer Hike 3最后一節(jié),? 全文翻譯
要在應(yīng)用中發(fā)布entity beans,你僅需要將這些類(lèi)文件打包成JAR. EJB 3.0 規(guī)范要求你在JAR包的META-INF目錄下提供一個(gè)persistence.xml。 在persistence.xml定義你將使用哪個(gè)數(shù)據(jù)庫(kù),定義EntityManager的默認(rèn)行為。你既可以把JAR發(fā)布到server的deploy目錄下,也可以把JAR放在EAR包中。
?
persistence.xml文件
??? persistence.xml包含一個(gè)或多個(gè)persistence-unit元素. 每一個(gè)persistence-unit定義了一個(gè)persistence context名字, data source設(shè)置, 和vendor specific properties. 以下是一個(gè)典型的persistence.xml文件.
<
persistence
>
??
<
persistence-unit?
name
="ejb3trail"
>
????
<
jta-data-source
>
java:/DefaultDS
</
jta-data-source
>
????
<
properties
>
??????
<
property?
name
="hibernate.hbm2ddl.auto"
????????????????value
="create-drop"
/>
????
</
properties
>
??
</
persistence-unit
>
</
persistence
>
它定義了以 ejb3trail命名的EntityManager 是用 java:/DefaultDS 作為數(shù)據(jù)源來(lái)持久化它所管理的entity beans的. 如果你想使用一個(gè)不同的數(shù)據(jù)庫(kù)來(lái)映射當(dāng)前persistence context中的entity beans,你可以改變數(shù)據(jù)源的JNDI名字以替換java:/DefaultDS(你需要提供相應(yīng)的*-ds.xml文件). 另外,還指定了JBoss服務(wù)器應(yīng)該在應(yīng)用deploy之時(shí)給這些entity beans創(chuàng)建相應(yīng)的表, 在應(yīng)用un-deploy之時(shí)刪除這些表。注意應(yīng)用的deploy和un-deploy是在server startup或shutdown時(shí)進(jìn)行的。
persistence.xml中的properties是application server specific的. 在JBoss AS中, 它們是簡(jiǎn)單的Hibernate properties因?yàn)镠ibernate是JBoss EJB 3.0的內(nèi)在實(shí)現(xiàn)框架.你可以在[server_installation]/server/deploy/ejb3.deployer/META-INF/persistence.properties 中找到一系列可用的properties 和它們的默認(rèn)值.
?
從一個(gè)特定的context中注入EntityManager
???? 正如我們所看到的,JAR包中的persistence.xml可以用不同的名字定義多個(gè)persistence contexts.為了從一個(gè)有名字的persistence context中得到EntityManager,? 你只需要指定@PersistenceContext標(biāo)注的unitName屬性. 下面的例子就是把ejb3trail persistence context注入到EntityManager.
@PersistenceContext(unitName
=
"
ejb3trail
"
)
EntityManager?em;
如果滿足下面的條件,你可以省去unitName:
1,僅在persistence.xml文件中定義了一個(gè)persistence context.
2,在應(yīng)用中使用了scoped classloader.
?
第2條可能需要更多的解釋. 如果在EAR包中包含WEB應(yīng)用, 意味著你需要在EAR包中的META-INF目錄下提供一個(gè) jboss-app.xml文件. 在這個(gè)文件中你可以給classloader指定任意一個(gè)名字,這里是一個(gè)例子:
<
jboss-app
>
??
<
loader-repository
>
????trailblazer:app=ejb3
??
</
loader-repository
>
</
jboss-app
>
如果你在應(yīng)用中未定義scoped classloader, 所有該應(yīng)用中定義的persistence contexts將在整個(gè)服務(wù)器中全局可用, 相應(yīng)地@PersistenceContext injection將在global context查找EntityManager. 這樣你可以使用在該應(yīng)用之外定義的persistence context. 但是此時(shí)你不得不通過(guò)unitName顯示地指定persistence context的名字。
?
小結(jié)?
??? 在這一節(jié)中,我們討論了怎樣給應(yīng)用配置多個(gè)persistence contexts.接下來(lái)我們將探討一章全新的內(nèi)容。