Actualmente estoy trabajando en un proyecto OSGi en Felix (v4.0.3). Necesito usar JPA, así que instalé los paquetes Apache Aries JPA. También instalé OpenJPA y lo necesito para conectarme a una base de datos MySQL, usando el paquete conector de MySQL. Desafortunadamente no funciona, OpenJPA dice que no puede encontrar la clase MySQL JDBC y no puedo entender qué está roto, tal vez estoy haciendo algo mal. Explicaré a continuación lo que instalé precisamente junto con el archivo persistence.xml y la excepción real que recibo.OpenJPA en OSGi no encuentra el paquete conector de MySQL JDBC
Aquí está la lista de los paquetes Apache Aries he instalado:
- org.apache.aries.jpa.api-0.3.jar
- org.apache.aries.jpa.container.context-0.3 .jar
- org.apache.aries.jpa.container-0.3.jar
- org.apache.aries.util-0.4.jar
luego instalado las dependencias de los Apache Aries JPA manojos. Les descargado de SpringSource:
- com.springsource.javax.transaction-1.1.0.jar
- com.springsource.org.apache.log4j-1.2.16.jar
- com.springsource. slf4j.api-1.6.1.jar
- com.springsource.slf4j.log4j-1.6.1.jar
- javax.persistence_2.0.4.v201112161009.jar (éste es de EclipseLink en caso de que importa)
Yo también i nstalled OpenJPA y todas sus dependencias. Encontré paquetes 2 a 5 (commons- *) en la carpeta lib de la carpeta descargada apache-openjpa-2.2.0. Descargué Serp here porque el jar que se encuentra en la carpeta lib no era un paquete OSGi. Finalmente encontré a los dos últimos paquetes (# 7 y # 8) en SpringSource:
- openjpa-2.2.0.jar
- Commons-collections-3.2.1.jar
- Commons-DBCP-1.4 .jar
- commons-lang-2.4.jar
- Commons-piscina-1.5.4.jar
- org.apache.servicemix.bundles.serp-1.13.1_4.jar
- com.springsource.javax .servlet-2.5.0.jar
- com.springsource.org.objectweb.asm-3.2.0.jar
Una vez que finalmente había instalado OpenJPA, todavía necesita el paquete del controlador JDBC de MySQL, que también me dieron desde el repositorio SpringSource junto con su commons-logging dependencia:
- com.springsource.com.mysql.jdbc-5.1.6.jar
- com.springsource.org.apache.commons.logging-1.1.1.jar
Ahora en este punto, la lista de paquetes instalados es cada vez más grande. Dije que instalé OpenJPA, pero es solo porque no pude entender cómo usar cualquier otro proveedor con Aries. Inicialmente quise usar EclipseLink, pero aparentemente Apache Aries no lo detecta como proveedor y de acuerdo con this blog tiene que crear otro paquete que contenga su propio activador para que Aries detecte EclipseLink. Lo intenté pero no funcionó, así que recurrí al uso de OpenJPA.
así que ahora tengo dos preguntas:
- ¿Cómo puedo hacer mi OpenJPA aviso MySQL Bundle?
o alternativamente:
- Cómo puedo hacer que Apache Aries cuenta EclipseLink?
Aquí está el archivo persistence.xml que utilizo:
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="userManager.model" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>org.project.dao.entity.UserEntity</class>
<properties>
<property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver" />
<property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/usermanager?autoReconnect=true" />
<property name="openjpa.ConnectionUserName" value="root" />
<property name="openjpa.ConnectionPassword" value="root" />
</properties>
</persistence-unit>
</persistence>
El error se produce cuando se ejecuta el siguiente constructor de mi clase DAO:
@PersistenceContext(unitName="userManager.model")
private EntityManager em;
private EntityManagerFactory emf;
public UserDAOBean() {
em = emf.createEntityManager();
}
Aquí está el error que consigo con OpenJPA no encontrando MySQL. Por supuesto, es importante mencionar que tanto la URL y el nombre de usuario/contraseña de hacer el trabajo:
<openjpa-2.2.0-r422266:1244990 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: There were errors initializing your configuration: <openjpa-2.2.0-r422266:1244990 fatal user error> org.apache.openjpa.util.UserException: A connection could not be obtained for driver class "com.mysql.jdbc.Driver" and URL "jdbc:mysql://localhost:3306/usermanager?autoReconnect=true". You may have specified an invalid URL.
at org.apache.openjpa.jdbc.schema.DataSourceFactory.newConnectException(DataSourceFactory.java:255)
at org.apache.openjpa.jdbc.schema.DataSourceFactory.newDataSource(DataSourceFactory.java:123)
at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.createConnectionFactory(JDBCConfigurationImpl.java:844)
at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getConnectionFactory(JDBCConfigurationImpl.java:732)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.openjpa.lib.conf.ConfigurationImpl.instantiateAll(ConfigurationImpl.java:295)
at org.apache.openjpa.conf.OpenJPAConfigurationImpl.instantiateAll(OpenJPAConfigurationImpl.java:1671)
at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:646)
at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:203)
at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
at org.apache.aries.jpa.container.impl.CountingEntityManagerFactory.createEntityManager(CountingEntityManagerFactory.java:64)
at javax.persistence.EntityManagerFactory$$Proxy.createEntityManager(Unknown Source)
He cortado la excepción (que sigue pasando una y otra vez), hasta este punto:
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver not found by org.apache.openjpa [12]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1460)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.apache.openjpa.jdbc.schema.DataSourceFactory.newDataSource(DataSourceFactory.java:85)
... 108 more
PD: No pude publicar los enlaces a Aries, OpenJPA o EclipseLink debido a la restricción de spam, lo siento:/