martes, noviembre 06, 2007

Api de Pesistencia de Java (JPA) y Netbeans

Cuando intentaba probar el Api de Pesistencia de Java (JPA) desde la última versión de Netbeans (NB 6 Beta 2.0) me he encontrado con algunos problemas, que tras un par de días he conseguido resolver.
Tras crear la conexión a la base de datos y la unidad de persistencia, las clases de persistencia que se incluyen por defecto en NB, TopLink (Oracle), no conseguían acceder al datasource de Tomcat.
El problema es que el datasource sí que estaba presente, ya que usando el método descrito en un post anterior en este mismo blog, sí que se recuperaba una conexión. El mensaje obtenido era el siguiente:

oracle.toplink.essentials.exceptions.ValidationExceptionException Description: Cannot acquire data source [jdbc/TestDS].
Después de mucho indagar, el problema es que es necesario modificar la forma en que TopLink recupera el datasource de Tomcat. Primero es preciso crear una clase que implemente oracle.toplink.essentials.tools.sessionconfiguration.SessionCustomizer:

package test;
import oracle.toplink.essentials.jndi.JNDIConnector;
import oracle.toplink.essentials.sessions.Session;
import oracle.toplink.essentials.tools.sessionconfiguration.SessionCustomizer;


public class TopLinkSessionCustomizer implements SessionCustomizer {
    public void customize(Session session) throws Exception {
        JNDIConnector connector = (JNDIConnector) session.getLogin().getConnector();
        connector.setLookupType(JNDIConnector.STRING_LOOKUP);
    }
}
Después es necesario modificar la unidad de persistencia (persistence.xml), para indicarle que debe usar esta clase y para modificar el nombre con el que se debe recuperar el datasource. En nuestro caso, el datasource se creaba con el nombre "jdbc/TestDS" y este es el nombre con el que se referencia en los archivos "context.xml", "web.xml" y "persistence.xml".
Pero en "persistence.xml" esto no es válido (al menos cuando se configura para un Tomcat). En este archivo debemos referenciar el nombre del datasource como "java:comp/env/jdbc/TestDS", de lo contrario, las clases de TopLink no encontrarán la referencia al datasource. En definitiva el archivo "persistence.xml" original pintaba así:

oracle.toplink.essentials.PersistenceProvider
jdbc/TestDS
test.entities.Test
Y el archivo modificado cambia el nombre del datasource y referencia a la clase SessionCustomizer que hemos creado:

oracle.toplink.essentials.PersistenceProvider
java:comp/env/jdbc/TestDS
test.entities.Test
Ahora ya somos capaces de acceder al datasource de Tomcat usando la el api JPA.
Una cosa más: la solución la encontré aquí.
Saludos

No hay comentarios: