Java Expert....Java/Open Source Addict

Redes Sociales

twitterlinkedinrss feedemail youtube

Mostrando entradas con la etiqueta TopLink. Mostrar todas las entradas
Mostrando entradas con la etiqueta TopLink. Mostrar todas las entradas

jueves, 2 de julio de 2009

Problemas con Transformador XML + JAVA + Toplink



Hay días en los que buscas y buscas la solución a un problema, te inventas diez mil y una formas para que luego!!!! nada el mismo error.....a todos nos pasa, el problema muchas veces radica en el cansancio que nos desvia la mente del objetivo final, hoy fue uno de esos días.

Bueno el problema radico en que estoy haciendo la migración de la capa de persistencia PersistenceManager a Toplink y me tope con un problema de transformación de los XML, para no hacerles largo el relato el código que tenía era este.

javax.xml.transform.TransformerFactory tFactory =
javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer = tFactory.
newTransformer(new javax.xml.transform.stream.StreamSource(new File(URLXSLT)));
javax.xml.transform.dom.DOMSource xmlDoc = new javax.xml.transform.dom.DOMSource(doc);
transformer.transform(xmlDoc, new javax.xml.transform.stream.StreamResult(new java.io.File(path)));

Cabe aclarar que todo funcionaba bien hasta que comence con Toplink, como Toplink implementa unas nuevas librerías para el manejo de xml como son xml.jar y xmlparserv2.jar (parseador) pense que podría haber alguna incopatibilidad colocando las dos en el classpath, hice las pruebas respectivas y nada, cambie de parseadores y seguia saliendo el mismo error:

javax.xml.transform.TransformerException: java.io.FileNotFoundException

Luego de implementar nuevos parser, abrirme jar y reemplementar cosas... buscar en internet full tiempo comence a ver otra forma de llamar al archivo (ojó que esto actualmente en la versión que se maneja del sistema funciona bien tal y como esta) y efectivamente por alguna extraña razón el problema radicaba aquí. Esta fue la solución:

javax.xml.transform.TransformerFactory tFactory =
javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer = tFactory.
newTransformer(new javax.xml.transform.stream.StreamSource(new File(URLXSLT)));
javax.xml.transform.dom.DOMSource xmlDoc = new javax.xml.transform.dom.DOMSource(doc);
transformer.transform(xmlDoc,
new javax.xml.transform.stream.StreamResult(new java.io.File(path).toURI().getPath()));


Como pueden apreciar la solución fue en cambiar la forma de llamar al archivo, estoy investigando porque se produjo esto. Talvéz la especificación de toplink asi lo requiere ya que utiliza nuevos jar y actualizaciones de los tipicos xalan y xerces, en todo caso ya les comentaré

Espero les sirve y que alegría salió esta situación.............seguimos en migración.

jueves, 8 de enero de 2009

Herencia en TopLink III Parte


Lamentó por la demora amigos(as)....tantas cosas pero bueno sigamos con el post...

Configurando la Herencia

Procedemos a configurar primero la clase padre para lo cual debemos configurar su descriptor, lo cual implica conocer cuáles subclases deben instanciarse deacuerdo a algún parámetro. Se puede optar por dos opciones:
  • La primera es utilizar campos indicadores en la clase descriptora padre, los cuales pueden ser números o cadenas que no deben mapearse a un atributo de la tabla a menos que sea solo de lectura ya que estos serán los encargados de determinar si una subclase es instanciada o no, para lo que se debe emplear un mecanismo de pareja clave - valor como se muestra en la figura a continuación:
  • La otra opción es utilizar un campo indicador con el nombre completo de la clase hija o padre como valor, dependiendo de que necesitemos instanciar, lo cual colocamos en una columna que sirve como campo indicador para saber que subclase se instanciara. Cabe aclarar que este campo indicador es un atributo de la clase padre (Tabla Padre) como se muestra a continuación:


  • La última opciónes utilizar métodos de extracción lo cual no abundaremos en este post.
En mi caso utilice la segunda opción a través del campo indicador tipoObjeto el cual me permitirá saber que clase hija debo instanciar. Con este preámbulo en mano comencemos la configuración de la clase Padre.


Configurando la clase Padre (Entidad)
Para configurar la clase padre lo primero que debemos hacer es activar la pestaña de Inherence , para lo cual nos colocamos sobre la ventana Structure seleccionamos nuestra clase Entidad y activamos la opción como se muestra en la figura(Lo mismo debemos realizarlo para los clases hijas):



Una vez activada la pestaña de Inherence se debe marcar la opción Is Root Descriptor (si no está activada) para indicar que esta será la clase padre, como voy a utilizar un campo indicador seleccionamos la opción Use Class Indicator Field y elegimos el campo respectivo que en nuestro caso es TipoObjeto quedando la configuración queda de la siguiente manera:


Configurando Clases Hijas

Teniendo ya configurada la clase padre es momento de configurar las clases hijas para lo cual realizamos tanto en la clase Empresa como Persona la activación de la opción Inherence (Como se menciono anteriormente).

En la clase hija tanto Empresa como Persona se tiene que desactivar la opción Is Root Descriptor para asegurar que estás serán tratadas como clases hijas, además se debe colocar el respectivo que es el Parent Descriptordescriptor padre Entidad como se muestra en la figura a continuación:

Luego de esto debemos modificar el campo indicador en la clase padre para que sea solo de lectura, para lo que seleccionamos el atributo tipoObjeto dentro de la clase Entidad en la ventana de Structure y marcamos la opción read only como se muestra en la figura a continuación:


Una vez realizado la configuración de los descriptores se debe modificar las clases hija Empresa y Persona para que extiendan de la clase Entidad lo cual involucra realizar las siguientes acciones:
  • Todas las clases hijas (Empresa, Persona) deben extender de su clase padre (Entidad).


  • El atributo que define la clave primaria en las tablas hijas debe ser omitido o borrado junto con sus métodos de acceso setter y getter, ya que las tablas hijas utilizarán como identificador al identificador del padre.
  • Las relaciones de las tablas hijas con las tabla padre ya no son necesarias ya no que devuelven ningún dato (pueden comprobarla y verán que su resultado es objeto nulo) por lo que en mi caso el atributo que define las relaciones con entidad y todo sus referencias fueron comentadas.


  • Para terminar se debe aclarar que no es necesario modificar los descriptores de cada clase eliminando o comentando las relaciones y atributos mencionados anteriormente para que funcione( eliminando la relación de entidad en cada clase hija por ejemplo), TopLink los omite. Pero sería conveniente hacerlo para ganar un poco de experiencia en el manejo de estos.

jueves, 18 de diciembre de 2008

Herencia en TopLink II Parte


Creando los Descriptores

Luego de realizar la configuración del proyecto descrita anteriormente nuestro proyecto presenta el siguiente estado:

Como podemos apreciar en la figura anterior tanto las tablas, como las clases y los archivos relacionados con el mapeo como son el InheritanceMap y el sessions.xml están creados. Ahora procederemos a crear los descriptores para lo cual seleccionamos el InheritanceMap en en la ventana System Navigator a lo cual se nos activa en el ventana Structure nuestras clases java lista para crear los descriptores y ser mapeadas como podemos apreciar en la figura a continuación:

Seleccionamos en la ventana Structure al mapa InheritanceMap y damos un click en el botón + para la creación de los descriptores a lo que se nos presenta primero una ventana donde seleccionamos las clases que queremos crear los descriptores junto con sus mapas como se puede apreciar en la figura a continuación:

Debemos seleccionar Ok para que nuestros descriptores sean creados, suele ocurrir en JDeveloper que cuando los atributos de las clases tienen nombres iguales a los atributos de las tablas el mapeo se genera automáticamente junto con esta operación (Mi caso). Caso contrario se deberá proceder a realizar el mapeo en base a los atributos de cada clase teniendo diferentes opciones como se muestra en la figura a continuación:

Una vez que se han generado los descriptores respectivos para cada clase, debemos proceder a configurar la herencia tanto para las clases hijas como para la clase padre lo cual lo veremos en el siguiente post

Herencia en TopLink I Parte


Comenzando la semana un poco agotado por la amanecida de ayer para variar….pero con todas las ganas de vivir una experiencia más de vida informática gracias a Dios comencé el día investigando la herencia con TopLink, este es mi primer post en mi nuevo blog así que espero que sea enriquecedor.

Solamente para aclarar un poco, la herencia de la forma más fácil describe como una clase hija puede reutilizar eficientemente tanto el estado (atributos) como el comportamiento (métodos) de su clase padre, además que es una técnica muy importante en la programación Orientada a Objetos…………………bueno es momento de comenzar para lo que necesitamos instalar dos requerimientos en especial, los cuales son:
  • Jdk 1.4.2 o posterior
  • JDeveloper 10G
Configurando e Inicializando Proyecto
Luego de tener instalado el ambiente de desarrollo, abrimos nuestro IDE JDeveloper y comenzamos creando una nueva aplicación llamada TopLinkInheritance con un proyecto llamado Inheritance como se muestra en las figuras a continuación:


Antes de continuar es necesario aclarar el esquema del modelo que vamos a atacar, el cual consiste de tres clases: una clase padre llamada Entidad y dos clases hijas llamadas Empresa y Persona respectivamente las cuales estarán representadas en la base de datos por una tabla cada una. El
modelo de clases podemos apreciarlo en la siguiente figura a continuación:

Cabe aclarar que en TopLink se maneja hasta tres tipos de jerarquía en herencia, es decir tres niveles, algo que debemos saber es que en el descriptor de la clase hija se pueden sobrescribir mapeos que han sido especificados en la clase padre o mapear atributos que no han sido mapeados en el descriptor de la clase padre.

Para poder continuar debemos asociar nuestro esquema creado llamado herencia con nuestras tablas para trabajar de una forma más eficiente, para lo cual nos dirigimos a nuestro proyecto y seleccionamos la opción Inheritance >> New >> Database Tier >> Offline Database Objects >> Offline Database Objects Imported from Database. Para poder proseguir con el wizard nos pedirá que creemos una nueva conexión de base de datos a lo cual la llamaremos InheritanceDB como podemos apreciar en la figura:

Luego de esto elegimos las tablas que vamos a utilizar, a lo cual marcamos nuestras tres tablas como podemos apreciarlo en la figura a continuación:


Luego de esto se nos presenta la opción para elegir un nuevo esquema para el tema de importación lo cual lo dejamos por defecto luego seleccionamos siguiente y nos presenta el resumen y se termina la creación, el estado en el cual queda el proyecto luego de estos pasos se lo puede apreciar en la figura a continuación:

Debemos aclarar que al igual que otros ORM (Object Relational Mapping) como hibernate éste se compone de POJOS y archivos que XML que en nuestro caso representan el mapeo con las tablas los cuales se llaman descriptores. Por lo cual comenzaremos creando primeros los POJOS que representan nuestras clases desde nuestras tablas para lo que seleccionamos la siguiente opción Inheritance >> New >> Business Tier >> Toplink >> Java Objects from Tables.


Lo primero que tenemos que hacer para proseguir es crear el archivo de mapeo de todas las clases conocido con el nombre de TopLink Map para lo cual seleccionamos la opción de New que se encuentra junto a él, a lo cual se nos presenta un pantalla donde debemos ingresar un nombre de mapa que lo llamaremos InheritanceMap seleccionar la versión de la bdd y la conexión como se puede apreciar en la figura a continuación:
Luego de realizar esto ya podemos proseguir al siguiente paso que consiste en seleccionar las tablas que nos servirán para crear nuestras clases java, seleccionamos todas las tablas como se aprecia en la figura:

Luego de esto seleccionamos el nombre del paquete en donde se crearan nuestras clases, le dejamos por defecto con el nombre del proyecto inheritance.


Como último paso se muestran el detalle de los objetos y el resumen con lo cual ya hemos realizado la creación de nuestras clases (POJOS). Ahora el siguiente paso y uno de los más importantes es crear los descriptores y realizar el mapeo……