【问题标题】:OSGi and Persistence UnitsOSGi 和持久性单元
【发布时间】:2013-06-17 02:46:38
【问题描述】:

大家好,我正在编写一个 OSGi 捆绑包,负责对用户进行身份验证。出于设计原因,我有义务对多个数据库模式执行查询(这些模式可以动态创建或删除)。我正在运行 MySQL 作为存储引擎。

不知何故,我需要能够为这些模式创建按需实体管理器,但我的尝试并没有成功。以下是我尝试过的让我更接近我需要的方法:

使用 JTA 数据源创建持久性单元 (Eclipselink),事实上,该数据源可以与默认模式建立数据库连接。但是,当我尝试覆盖任何属性时,例如 javax.persistence.jdbc.url。但是,它始终指向默认架构。

我相信我没有正确覆盖该属性,或者 JTA 数据源属性无法从 EntityManager 修改为 EntityManager。以下是我创建 EntityManagers 的方法:

Map<String, String> dbProps = new HashMap<String, String>();            
dbProps.put("javax.persistence.jdbc.url","jdbc:mysql://mydomain:3306/mydynamicdb);                                                        
EntityManagerFactory fact = Persistence.createEntityManagerFactory("myPersistenceUnit", dbProps); 
EntityManager myEM = fact.createEntityManager();  

最后,他们都继续指向默认架构,所以我的问题是:

  1. 这是动态 EntityManager 处理的有效方法吗?如果是这样,我怎样才能有效地覆盖架构属性?
  2. 除了覆盖还有其他选择吗?

我提前感谢您提供的任何指导。

【问题讨论】:

    标签: java dynamic properties persistence osgi


    【解决方案1】:

    如果您想在 OSGi 中使用 EclipseLink,您必须使用包装 EclipseLink 的 Gemini JPA 项目,并为您的 PU 包创建和注册 EntityManagerFactory 和 EntityManagerFactoryBuilder 服务。 如果想在PU之间共享jdbc连接可以使用Gemini DBAccess提供的JDBC服务

    【讨论】:

      【解决方案2】:

      您应该能够获取EntityManagerFactory 作为OSGi 服务,您可以(LDAP)使用服务属性osgi.unit.name 过滤正确的服务,如下所示:

          ServiceReference[] refs = null;        
          String filter = "(osgi.unit.name=myPersistenceUnit)";
          ServiceReference[] refs = ctx.getServiceReferences(EntityManagerFactory.class.getName(), filter);
          //Should only be one reference, check (throw exception etc)
          return (EntityManagerFactory)ctx.getService(refs[0]);
      

      您可以通过在 OSGi shell 中列出 EntityManagerFactory 服务(带有属性)来检查所有持久性单元是否存在。

      【讨论】:

        猜你喜欢
        • 2012-12-19
        • 2013-11-27
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 2012-08-10
        • 2013-02-15
        • 1970-01-01
        相关资源
        最近更新 更多