背景:
第一步(有效!):
管理数据库操作的插件,其结构:
com.plugin.name
JRE System Library
Plug-in Dependencies
Referenced Libraries (contains the mysql connector jar)
src/
com.plugin.name (package containing the plugin activator)
com.plugin.name.entities (package containing all my entities)
com.plugin.name.utils (package containing my access functions and a main)
META-INF/
persistence.xml
META-INF/
MANIFEST.MF
在 com.plugin.name.utils 中,我让我的类执行所有持久性功能。
在这个类中,我以这种方式创建一个EntityManagerFactory:
private static final EntityManagerFactory ENTITY_MANAGER_FACTORY = Persistence.createEntityManagerFactory(" com.plugin.name");
其中" com.plugin.name"是我的persistence.xml中定义的持久性单元名称
在其中一个类中,我有一个主要运行一些与数据库相关的函数。
当我将此主程序作为java应用程序运行时,一切正常。
(为了防止将来出现问题:我的persistence.xml文件最初是在MANIFEST.MF META-INF文件夹中生成的,但在运行此主文件时,它无法找到,所以我移动了它。我从另一个插件调用持久性函数时检查了两种配置)
问题:
我需要从另一个插件访问我的持久性功能,让我们称呼他为 com.plugin.other
所以我添加了 com.plugin.name 作为此插件的依赖项。 但是当我尝试运行该应用程序时,我收到以下错误:
javax.persistence.PersistenceException:没有名为com.plugin.name的EntityManager的持久性提供程序 在javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)
在javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
当我将main作为独立应用程序运行时,如果persistence.xml文件有任何问题(找不到,不完整等),至少会提到它......我在这里真的卡住了毫无头绪地了解问题的来源。
答案 0 :(得分:0)
我最后通过在PersistenceProvider中使用createContainerEntityManagerFactory(PersistenceUnitInfo info,Map map)方法在没有persistence.xml的情况下完成了它。
代码:
Activator a = Activator.getDefault();
Bundle b = a.getBundle();
URL url = b.getResource("META-INF/persistence.xml");
List<PersistenceProvider> providers = PersistenceProviderResolverHolder.getPersistenceProviderResolver().getPersistenceProviders();
for (PersistenceProvider pp : providers) {
PersistenceUnitInfoImpl pui = new PersistenceUnitInfoImpl();
pui.setPersistenceUnitName("persistenceUnitName");
pui.setTransactionType(PersistenceUnitTransactionType.RESOURCE_LOCAL);
pui.setPersistenceUnitRootUrl(url);
Properties prop = pui.getProperties();
if (prop == null) {
prop = new Properties();
}
prop.setProperty("javax.persistence.jdbc.url", "jdbc:mysql://ip:port/dbName");
prop.setProperty("javax.persistence.jdbc.user", "dbUser");
prop.setProperty("javax.persistence.jdbc.password", "dbPass");
prop.setProperty("javax.persistence.jdbc.driver", "com.mysql.jdbc.Driver");
pui.setProperties(prop);
pui.setClassLoader(com.mysql.jdbc.Driver.class.getClassLoader());
emFactory = pp.createContainerEntityManagerFactory(pui, null);
}
}