Hoy me han publicado un nuevo tutorial en Javahispano. En este caso el objetivo era hablar un poco de los Business Components de Oracle ADF, y explicar algunas de las cosas que se pueden hacer al trabajar con ellos en jDeveloper 11.
Este tutorial viene a complementar al que ya presenté hace unos meses sobre el desarrollo de una aplicación Web con ADF, y pretende además satisfacer algunas de las solicitudes que me llegaron en sus comentarios.
Espero que sea útil.
Mostrando entradas con la etiqueta ADF. Mostrar todas las entradas
Mostrando entradas con la etiqueta ADF. Mostrar todas las entradas
lunes, 12 de septiembre de 2011
martes, 22 de marzo de 2011
¿Cómo obtener el valor de una campo de una secuencia Oracle trabajando con ADF BC?
Un título largo y descriptivo que plantea perfectamente el problema a tratar. Resulta que cuando queremos que el valor de una campo se obtenga directamente de una secuencia Oracle y estamos utilizando ADF Business Components, es fácil que cometamos un error.
Cuando configuramos los atributos de un Entity Object, podemos seleccionar varios tipos de dato, entre los que se encuentra DBSequence. Cuando elegimos esta opción, el diálogo de jDeveloper muestra un par de campos nuevos en los que nos pide que indiquemos un nombre de secuencia, y un valor de comienzo. Es lógico pensar que si ponemos en ese campo, por ejemplo, SEQ_PERSONA, el framework se encargará de coger el valor correspondiente de la secuencia, e inyectarlo en el campo que estamos editando. Nada más lejos de la realidad...
El utilizar el tipo DBSequence para un campo indica a ADF que el valor para el mismo va a ser proporcionado por la base de datos, pero ADF no se va a encargar de obtenerlo. Lo que va a hacer es asignar un valor temporal al campo, y esperar a que la base de datos le proporcione el real a la hora de persistir la información. El valor temporal será un número negativo.
Esto implica que nos toca a nosotros obtener el valor de la secuencia y utilizarlo para informar el campo. Una forma sencilla de hacerlo es crear un trigger en la base de datos que se ejecute antes de cada inserción en la tabla correspondiente. De forma general el código tendría el siguiente aspecto.
CREATE OR REPLACE TRIGGER %NOMBRE_TRIGGER%
BEFORE INSERT ON %TABLA% FOR EACH ROW
BEGIN
IF :NEW.%CAMPO% IS NULL OR :NEW.%CAMPO% < 0 THEN
SELECT %NOMBRE_SECUENCIA%.NEXTVAL
INTO :NEW.%CAMPO%
FROM DUAL;
END IF;
END;
Y, entonces, ¿para qué nos pide el IDE el nombre de la secuencia? Pues este dato sólo tendrá utilidad si estamos utilizando un enfoque en el que creemos en primer lugar nuestros objetos de negocio, y a partir de ellos queramos generar el esquema de datos. En este caso, jDeveloper creará, además de la tabla, la secuencia indicada en la base de datos.
jueves, 10 de marzo de 2011
Tutorial de Oracle ADF
Hoy me han publicado un nuevo tutorial en Javahispano. En este caso sobre el desarrollo de una aplicación Web con Oracle ADF, utilizando jDeveloper 11.
En el documento se hace una breve introducción teórica al framework de Oracle, comentando su arquitectura y, posteriormente, se detallan los pasos a seguir para crear una aplicación Web simple basada en ADF utilizando el entorno de desarrollo jDeveloper, en su versión 11. En el proceso se cubre desde la definición de la base de datos hasta el despliegue en el servidor WebLogic integrado en el IDE.
ADF es un framework basado en la arquitectura MVC, y ofrece un solución para cada una de las capas, aunque permite igualmente el uso de casi cualquier combinación de las tecnologías J2EE más extendidas. En el ejemplo del tutorial se ha optado por trabajar con JSF para la vista y el controlador (con la implementación ADFFaces, concretamente), y con EJB para la capa de servicios de negocio.
El tutorial se puede descargar en esta dirección.
Muchas gracias de nuevo a todo el equipo de Javahispano.
Etiquetas:
ADF,
EJB,
J2EE,
JavaHispano,
jDeveloper,
JSF,
MVC,
Oracle,
tutorial,
WebLogic
domingo, 12 de diciembre de 2010
¿Dónde están mis mensajes de error?
En estos días, trabajando en el que espero que sea mi segundo tutorial publicado en JavaHispano, he pasado de utilizar la versión 11.1.1.2 de jDeveloper, a la 11.1.1.3. En principio todo fue muy bien; de hecho, no se aprecian cambias sustanciales al trabajar con las tecnologías que estaba utilizando. Sin embargo, he tenido unos días de complicaciones por un mensaje de error desaparecido. ¿Quién me lo iba a decir?
Resulta que tenía una aplicación casi completamente desarrollada, que mostraba un popup cada vez que se producía un error. Por ejemplo, si al ejecutar una consulta sobre la base de datos obtenía una excepción ORA-XXXXX, ésta iba recorriendo las distintas capas hasta aparecer delante del usuario.
Sin embargo, al empezar a trabajar con la versión 11.1.1.3 del IDE, los mensajes de error dejaron de mostrarse. Seguían recogiéndose como siempre en el log de jDeveloper, pero nada más. No había forma de presentarlos al usuario.
Al final, preguntando en el foro de Oracle, se confirmaron las sospechas de que era un cambio de comportamiento de la nueva versión. Por el momento no conozco ninguna forma para conseguir que los mensajes lleguen a la interfaz, así que la única opción si los queremos es volver atrás, y esperar.
martes, 30 de noviembre de 2010
Error adquiriendo fuentes de datos en jDeveloper 11
En los últimos días he estado lidiando con un problema trabajando con jDeveloper 11.1.1.3.0. Estaba desarrollando una aplicación utilizando ADF y EJB, que venía funcionando correctamente. Sin embargo, un buen día, al arrancar el servidor, sin haber realizado cambios desde la última vez, me encuentro que mi aplicación lanza la siguiente excepción:
Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [java:/app/jdbc/jdbc/TareasDS].
Internal Exception: javax.naming.NameNotFoundException: While trying to look up /app/jdbc/jdbc/TareasDS in /app/ejb/ModelEJB.jar#TareasSessionEJB.; remaining name '/app/jdbc/jdbc/TareasDS'
at org.eclipse.persistence.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:451)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:116)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
...
...
...
Caused by: javax.naming.NameNotFoundException: While trying to look up /app/jdbc/jdbc/TareasDS in /app/ejb/ModelEJB.jar#TareasSessionEJB.; remaining name '/app/jdbc/jdbc/TareasDS'
at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1139)
at weblogic.jndi.internal.ApplicationNamingNode.lookup(ApplicationNamingNode.java:144)
at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:254)
at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:393)
at weblogic.jndi.factories.java.ReadOnlyContextWrapper.lookup(ReadOnlyContextWrapper.java:45)
at weblogic.jndi.internal.AbstractURLContext.lookup(AbstractURLContext.java:135)
at javax.naming.InitialContext.lookup(InitialContext.java:396)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:110)
... 204 more
Este error indica que la aplicación está tratando de acceder al DataSource indicado en el fichero persistence.xml, pero no lo consigue. Por tanto lo primero que uno puede pensar es que el fallo tiene que venir de algún problema de configuración de ese fichero, y empezar a editarlo: quitando el doble /jdbc, añadiendo y eliminando propiedades... Sin embargo no van por ahí los tiros.
A la hora de desplegar una aplicación en el servidor de aplicaciones WebLogic embebido de jDeveloper, éste crea fuentes de datos basándose en las conexiones configuradas por el usuario, que se pueden ver en la pestaña Database Navigator (si no la veis junto al Application Navigator podéis mostrarla mediante el menú View - Database - Database Navigator).
Pues bien, en mi caso el problema se debía a que, por algún motivo, la contraseña había desaparecido de las propiedades de la conexión que había configurado para mi aplicación. Bastó volver a introducirla y redesplegar la aplicación para que todo volviese a funcionar como siempre.
Sólo queda averiguar qué fue de la contraseña.
Suscribirse a:
Entradas (Atom)