Reutilizar modelo de datos en varios proyectos

2013-07-10
2013-07-15
  • Buenos días!
    Mi intención es crear un proyecto (aplicación) que englobe varios proyectos (aplicaciones) más pequeños. El proyecto principal sería una especie de lanzador de aplicaciones mediante botones o links. La idea es poder tener los modelos de datos comunes a varios proyectos en el proyecto principal y así poder reutilizar el modelo de datos para varios proyectos. Tener una única tabla en BBDD pero acceder a ella desde varios de los proyectos. Los modelos que son propios de un único proyecto tenerlos en ese proyecto o incluso en el principal.

    Un ejemplo:
    Proyecto1
    src
    org.openxava.proyecto1.model
    Usuario.java

    Proyecto2
    src
    org.openxava.proyecto2.model
    Otromodelo.java (con una propiedad Usuario definida dentro del modelo).

    Con el Eclipse lo que he hecho es añadir el proyecto1 al proyecto2 y se me quitan los errores ya que puedo hacer el import bien.

    En Otromodelo.java he hecho lo siguiente:
    @ManyToOne(fetch=FetchType.LAZY, optional=false)
    private Usuario usuario;

    El problema llega a la hora de hacer el build del Proyecto2. Me lanza este error:
    [hibernatetool] An exception occurred while running exporter #2:hbm2ddl (Generates database schema)
    [hibernatetool] To get the full stack trace run ant with -verbose
    [hibernatetool] Problems in creating a configuration for JPA. Have you remembered to add hibernate EntityManager jars to the classpath ?
    [hibernatetool] java.lang.reflect.InvocationTargetException
    [hibernatetool] java.lang.NoClassDefFoundError: org/openxava/proyecto1/model/Usuario
    [hibernatetool] java.lang.ClassNotFoundException: org.openxava.proyecto1.model.Usuario
    [hibernatetool] A class were not found in the classpath of the Ant task.
    [hibernatetool] Ensure that the classpath contains the classes needed for Hibernate and your code are in the classpath.

    Alguna idea del error? Nueva sugerencia a la hora de enfocarlo?

    Muchas gracias!

     
  • Javier Paniza
    Javier Paniza
    2013-07-12

    Hola Alfredo,

    por la excepción supongo que el problema se produce al ejecutar updateSchema. ¿Tienes el jar del proyecto del que dependes dentro de WEB-INF/lib de tu proyecto?

    De todas formas me temo que poner el JAR en WEB-INF/lib no satisfará a JPA, porque JPA por defecto buscar las entidades en WEB-INF/classes, ignorando los jars de los libs. Esto se puede cambiar de varias formas:
    1. Incluyendo un WEB-INF/persistence.xml en el jar.
    2. Referenciando al jar desde el persistence.xml de tu aplicación.
    3. Enumerando tus entiedades en persistence.xml.

    Donde la opción 1 no te sirve porque el jar tendría otra unidad de persistencia lo que te impedería hacer asociaciones JPA entre las clases de fuera y dentro del jar. La opción 2 sería perfecta si no fuera porque por un bug de hiberante solo funciona si pones una ruta absoulta, lo que la hace inutil, a lo mejor hay suerte y ese bug ya lo han arregaldo, pruebalo. Y la opción 3 es demasiado laboriosa (al menos para mí).

    Al final lo mejor es hacer una tarea ant que copie el código fuente de un proyecto a otro (aunque sea a otra carpeta de código fuente separada). Así tienes una única unidad de persistencia y no es laborioso.

    Posiblemente haya más soluciones, tendrás que investigarlo.

    Esto no es un asunto propio de OpenXava sino de JPA, eso es bueno porque puede que en foros de JPA o Hibernate encuentres más información sobre esto.


    Ayuda a otros en este foro como yo te ayudo a ti.
    ¿Necesitas más ayuda? Usa el soporte profesional de OpenXava

     
  • Buenos días!

    Efectivamente el error me lo muestra cuando ejecuto el updateSchema del proyecto principal (el que englobaría los otros). El updateSchema del proyecto dependiente se hace bien.

    Lo que hice fue agregar con la opción de eclipse "Vía de construcción Java" el proyecto del que dependía (foto). No he puesto ningún jar en WEB-INF/lib. Probaré eso que me dices aunque ya me avisas de que crees que no funcionará. De todas maneras intentaré trasladarlo también al foro de Hibernate.

    Gracias por la respuesta.

     
    Attachments
  • He probado el punto 1, creando un jar del proyecto que contiene el modelo que me hace falta y pegándolo en la carpeta WEB-INF/lib del proyecto dependiente. Hice el updateSchema, todo bien, ya no daba error, pero a la hora de mostrarme la interfaz (propia mía) me daba un error ya que no conocía la tabla. Entonces opté por modificar el persistence.xml, punto 3, añadiéndole
    < class>org.openxava.proyecto.model.MiClase< /class>
    y ya funciona perfectamente. Me muestra el descriptionsList y me deja añadir, modificar...

    Seguiré investigando por si existe algo mejor pero de momento eso me sirve.

    Muchas gracias, un saludo.