0

我有一个 OSGi 项目,其中包含一个带有 JPA 注释域模型的包和另一个使用 Eclipselink 作为持久性提供程序的包。后者实例化EntityManager使用配置参数来确定 JDBC 驱动程序的类名。

现在,包含模型的捆绑包需要能够看到 JDBC 驱动程序,我认为这是因为 eclipselink 使用模型类的类加载器来加载它。这有一个不需要的副作用,我需要Import-Package在模型的包中明确声明一个指令来拉入驱动程序。然后通过 OSGi 交换驱动程序不再容易(我需要重新生成清单),这首先违背了使用 OSGi 的目的。

由于 JDBC 驱动程序都实现了相同的接口,我想做的是将数据库驱动程序放在它们自己的包中,将它们注册到 OSGi 容器中的通用接口名称下,并让 eclipselink 使用任何可用的东西。但我看不到如何做到这一点,因为似乎驱动程序是由 eclipselink 实例化的,这意味着我不能在其他地方实例化它并且让 eclipselink 忘记实际的类名。

这似乎是一件非常典型的事情。我想那里已经有解决方案了?

今年早些时候 Oracle 的 Shaun Smith 的这篇文章表明可能没有,但它也表明对它的需求似乎是相当真实的。

4

1 回答 1

2

听起来像是eclipselink的一个缺点。我建议为此提交错误/功能请求。

解决您的问题的方法是将另一个包引入从您的模型和 JDBC 驱动程序包导入的图片中,然后将 eclipselink 指向该新包。

这意味着您的模型没有对 JDBC 内容的任何引用,您可以在新包中建立连接。缺点是每个受支持的 JDBC 驱动程序都需要一个这样的包,但这些包几乎是样板代码,所以在几分钟内创建另一个包应该很简单。

另一种解决方案可能是编写您自己的 JDBC 驱动程序,该驱动程序只是包装了真正的驱动程序。在您的代码中,您可以使用 OSGi 发现来查找可用的真实驱动程序,而 eclipselink 似乎没有任何变化。

于 2009-10-13T09:21:14.523 回答