在Eclipse RCP(Java SE)环境中实现JPA EntityManager

时间:2016-07-29 16:25:22

标签: jpa eclipse-rcp persistence entitymanager jpa-2.1

背景:

  • Eclipse RCP项目,分为插件,每个插件专门用于任务(例如:HMI管理,通信......)
  • 在数据库中保留一些数据的必要性 =>
    • ORM:hibernate的JPA(JPA 2.1,Hibernate 5.2.1通过org.hibernate.core插件用于构造here (page 8)
    • 数据库:在mysql中
    • 约束:Java SE环境,因此获取EntityManager(用于持久性操作)的唯一方法是通过EntityManagerFactory创建它

第一步(有效!):

管理数据库操作的插件,其结构:

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文件有任何问题(找不到,不完整等),至少会提到它......我在这里真的卡住了毫无头绪地了解问题的来源。

1 个答案:

答案 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);
    }
}