我有一个OSGi项目,其中包含一个包含JPA注释域模型的包和另一个使用Eclipselink作为持久性提供程序的包。后者使用配置参数实例化EntityManager
以确定JDBC驱动程序的类名。
现在,带有模型的bundle需要能够看到JDBC驱动程序,我想,这是因为eclipselink使用模型类的类加载器来加载它。这有不必要的副作用,我需要在模型的bundle中显式声明Import-Package
指令以引入驱动程序。通过OSGi交换驱动程序然后不再容易(我需要重新生成清单),这首先打破了使用OSGi的目的。
由于JDBC驱动程序都实现了相同的接口,我想要做的是将数据库驱动程序放在它们自己的bundle中,在它们的公共接口名下用OSGi容器注册它们,并让eclipselink使用任何可用的东西。但是我看不出怎么做,因为看起来驱动程序是由eclipselink实例化的,这意味着我无法在其他地方实例化,并且eclipselink无法忽略实际的类名。
这似乎是一件非常典型的事情。我想那里已经有了一个解决方案吗?
甲骨文的Shaun Smith从今年早些时候开始表示可能没有,但它也表明对它的需求似乎是非常真实的。答案 0 :(得分:2)
听起来像是eclipselink的缺点。我建议为此提交错误/功能请求。
您的问题的解决方法是在图片中引入另一个包,该包从您的模型和JDBC驱动程序包中导入,然后将eclipselink指向该新包。
这意味着您的模型不受任何JDBC内容的引用,您可以在新的bundle中建立连接。缺点是每个支持的JDBC驱动程序都需要这样一个bundle,但是这些bundle几乎都是样板代码,所以在短时间内创建另一个很简单。
另一种解决方案可能是编写自己的JDBC驱动程序,它只包含真正的驱动程序。在您的代码中,您可以使用OSGi发现来查找可用的实际驱动程序,而eclipselink似乎没有任何变化。