我的邮箱中有一个bug报告。它报告了在Weblogic server环境中的Hibernate和Kodo之间切换JPA持久性提供者时的一个问题。在再现这个bug的过程中,我学到了一些知识,包括如何在Weblogic Server 10.0中安装Hibernate,以及如何使用一个特定的持久性提供者X部署基于JPA的Web应用程序,然后再使用另一个持久性提供者Y重新部署它而不会使整体(指Weblogic Server)崩溃。
这次经历促使我在一段停顿之后又开始了文章写作(New Yorker杂志的一幅漫画触发了我的写作灵感)。
总之,这篇文章将:
描述在Weblogic Server 10.0中安装和配置Hibernate的工作过程
解答为何不必在Weblogic Server 10.0中安装Kodo或OpenJPA
展示一个非常简单的基于无状态会话Bean的服务的例子,并演示在Weblogic Server运行状态下在Hibernate、OpenJPA和Kodo之间切换JPA提供者的步骤
再现产生问题的bug,不仅是因为报告者认为这很严重,在经过简短的实验之后,我也认为如此
介绍这个bug如何造成应用服务器环境中JPA引导的变化
测试提供者切换的一个非常简单的方法
我使用了一个简单的服务来检验是否使用了正确的提供者并且运行无误——虽然只是初步的持久性操作。这个简单的服务接口(我将基于它进行测试)如下所示:
JPAService.java
01
package service;
02 /**
03 * A very simple service to verify the persistence provider being used.
04 * The service also can persist a simple log message in a database.
05 *
06 * @author ppoddar
07 *
08 */
09
public interface JPAService {
10 /**
11 * Returns the name of the active provider.
12 */
13 public String getProvider();
14
15 /**
16 * Logs the given message.
17 *
18 * @param message an arbitray message string.
19 *
20 * @return a Message instance that has been persisted. The service will
21 * attach a timestamp to the message.
22 */
23 public Message log(String message);
24 }
关于这个服务将如何实现还不明确;甚至没有说明它将使用JPA。这是服务定义应有的方式——实现技术的不明确性(这里省略了通常的 IMO——这是我的观点——也许是谦虚的,也许恰恰相反)。
基于JPA和会话Bean的应用程序入门
我将简短地讨论一下如何在使用JPA的无状态会话Bean中实现这个服务。这是相当基本的知识。如果您已经熟悉JPA,可以直接跳到。
在这个简单的例子中,一个使用JPA的无状态会话Bean实现了这个服务。
JPAServiceBean.java
01
package session;
02
03 import javax.ejb.Remote;
04 import javax.ejb.Stateless;
05 import javax.persistence.EntityManager;
06 import javax.persistence.PersistenceContext;
07
08 import service.JPAService;
09 import service.Message;
10
11 /**
12 * A Stateless Session bean that uses an injected JPA EntityManager to implement
13 * the contract of {@link JPAService}.
14 *
15 * @author ppoddar
16 *
17 */
18 @Stateless
19 @Remote(JPAService.class)
20 public class JPAServiceBean {
21 /**
22 * Inject an EntityManager for a persistent unit simply named
23 *
test.
24 * It is this name which must be specified in the configuration file
25 * META-INF/persistence.xml as
26 * <pre>
27 * <persistence-unit>
28 *