0

我想在带有 DS(声明式服务)的 Karaf 上使用 Aries JPA,但我需要更多地控制 EM 的创建。

我想获取 EntityManagerFacroty 或 Builder 的实例,以便我可以即时创建自己的 EM。

原因是我有一个工厂服务,它创建不同的 EM,这取决于客户端需要连接到哪个 DataSource,所以我不能在我的服务中硬编码连接的名称。

就像是:

@Reference(target = "(osgi.unit.name=my.factory)")
    protected EntityManagerFactoryBuilder emfb;

我可以用它来按需制造工厂和 EM。

还有关于在 Karaf 上设置 eclipse 链接作为提供程序的任何提示:* Derby * MySql

谢谢。

取得了一些进展,如果捆绑包包含具有此单元名称的持久性单元,则 aries 会将 EMFB 注入到您的组件中。

我现在正在尝试使用 eclipse 链接属性从该组件建立到 Derby/Mysql 的新连接,但出现驱动程序丢失错误。

eclipselink.jdbc.write-connections.max=10
javax.persistence.jdbc.url=jdbc\:mysql\://192.168.99.101:3306/database
eclipselink.jdbc.write-connections.min=1
eclipselink.ddl-generation=create-or-extend-tables
javax.persistence.jdbc.user=*****
javax.persistence.jdbc.password=******
eclipselink.jdbc.read-connections.max=10
eclipselink.logging.level=INFO
eclipselink.jdbc.read-connections.min=1

我正在使用这些配置属性来创建一个新的 EntityManagerFactory 并测试我是否可以像这样创建一个 EntityManager:

try {
    emf = emfb.createEntityManagerFactory(configuration);
    if (emf.isOpen()) {
       // test creating a new EM
        EntityManager em = emf.createEntityManager();
        LOGGER.info("EntityManager: [{}]", em);
        em.close();
    } else {
        LOGGER.error("EMF is closed");
    }
} catch (Exception ex) {
    LOGGER.error("Exception", ex);
}

我收到一个错误,即未定义 mysql 或 derby(我尝试使用 derby 属性)。

2016-06-23 20:17:48,643 | ERROR | nsole user karaf | FactorySessionProviderImpl       | 374 - factory - 4.1.1 | activate | Exception
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.1.v20150916-55dc7c3): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: No suitable driver found for jdbc:mysql://192.168.99.101:3306/database?autoReconnect=true&autoReconnectForPools=true
Error Code: 0
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:815)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:205)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:305)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:337)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:303)
        at com.factory.FactorySessionProviderImpl.activate(FactorySessionProviderImpl.java:90)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_91]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_91]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_91]

我为 pax-jdbc 安装了 karaf 功能 pax-jdbc-config pax-jdbc-mysql pax-jdbc-derby 还有 jpa、eclipselink

    <feature>jpa</feature>
    <feature>eclipselink</feature>
   ...
4

1 回答 1

0

好的,找到问题了!

这是配置属性。

javax.persistence.jdbc.driver=com.mysql.jdbc.Driver
eclipselink.target-database=MySql
javax.persistence.jdbc.url=jdbc\:mysql\://<address:ip>/datasource?autoReconnect=true&autoReconnectForPools=true
javax.persistence.jdbc.user=***
javax.persistence.jdbc.password=*** 
eclipselink.jdbc.write-connections.max=16
eclipselink.jdbc.write-connections.min=4
eclipselink.jdbc.read-connections.max=64
eclipselink.jdbc.read-connections.min=16
eclipselink.ddl-generation=create-or-extend-tables
eclipselink.logging.level=INFO
于 2016-06-25T11:47:47.923 回答