这是TrailBlazer Hike 3最后一节, 全文翻译
要在应用中发布entity beans,你仅需要将这些类文件打包成JAR. EJB 3.0 规范要求你在JAR包的META-INF目录下提供一个persistence.xml。 在persistence.xml定义你将使用哪个数据库,定义EntityManager的默认行为。你既可以把JAR发布到server的deploy目录下,也可以把JAR放在EAR包中。
persistence.xml文件
persistence.xml包含一个或多个persistence-unit元素. 每一个persistence-unit定义了一个persistence context名字, data source设置, 和vendor specific properties. 以下是一个典型的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 作为数据源来持久化它所管理的entity beans的. 如果你想使用一个不同的数据库来映射当前persistence context中的entity beans,你可以改变数据源的JNDI名字以替换java:/DefaultDS(你需要提供相应的*-ds.xml文件). 另外,还指定了JBoss服务器应该在应用deploy之时给这些entity beans创建相应的表, 在应用un-deploy之时删除这些表。注意应用的deploy和un-deploy是在server startup或shutdown时进行的。
persistence.xml中的properties是application server specific的. 在JBoss AS中, 它们是简单的Hibernate properties因为Hibernate是JBoss EJB 3.0的内在实现框架.你可以在[server_installation]/server/deploy/ejb3.deployer/META-INF/persistence.properties 中找到一系列可用的properties 和它们的默认值.
从一个特定的context中注入EntityManager
正如我们所看到的,JAR包中的persistence.xml可以用不同的名字定义多个persistence contexts.为了从一个有名字的persistence context中得到EntityManager, 你只需要指定@PersistenceContext标注的unitName属性. 下面的例子就是把ejb3trail persistence context注入到EntityManager.
@PersistenceContext(unitName
=
"
ejb3trail
"
)
EntityManager em;
如果满足下面的条件,你可以省去unitName:
1,仅在persistence.xml文件中定义了一个persistence context.
2,在应用中使用了scoped classloader.
第2条可能需要更多的解释. 如果在EAR包中包含WEB应用, 意味着你需要在EAR包中的META-INF目录下提供一个 jboss-app.xml文件. 在这个文件中你可以给classloader指定任意一个名字,这里是一个例子:
<
jboss-app
>
<
loader-repository
>
trailblazer:app=ejb3
</
loader-repository
>
</
jboss-app
>
如果你在应用中未定义scoped classloader, 所有该应用中定义的persistence contexts将在整个服务器中全局可用, 相应地@PersistenceContext injection将在global context查找EntityManager. 这样你可以使用在该应用之外定义的persistence context. 但是此时你不得不通过unitName显示地指定persistence context的名字。
小结
在这一节中,我们讨论了怎样给应用配置多个persistence contexts.接下来我们将探讨一章全新的内容。