java grails jpa groovy gorm
here

java - Usar clases de dominio JPA en Grails



groovy gorm (3)

Quiero utilizar un modelo de dominio JPA en una aplicación desarrollada utilizando el último hito de Grails (2.0.0.M1). Las clases de dominio JPA están en el directorio src/java de la aplicación.

En base a esta publicación de blog que describe cómo usar un modelo de dominio JPA existente en una aplicación Grails, creé grails-app/conf/hibernate/hibernate.cfg.xml con una lista de mis clases anotadas por JPA.

En caso de que alguien esté lo suficientemente aburrido como para querer ejecutar la aplicación, está disponible here . Cuando ejecuta la aplicación, se produce el siguiente error al iniciar

Error 2011-08-04 23:28:19,777 [Thread-8] ERROR context.GrailsContextLoader - Error executing bootstraps: Error creati ng bean with name ''grailsDomainClassMappingContext'': Instantiation of bean failed; nested exception is org.springframewo rk.beans.BeanInstantiationException: Could not instantiate bean class [org.codehaus.groovy.grails.domain.GrailsDomainCla ssMappingContext]: Constructor threw exception; nested exception is java.lang.NullPointerException Line | Method ->> 303 | innerRun in java.util.concurrent.FutureTask$Sync - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 138 | run in java.util.concurrent.FutureTask | 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker | 908 | run in '''' ^ 662 | run . . in java.lang.Thread Caused by BeanInstantiationException: Could not instantiate bean class [org.codehaus.groovy.grails.domain.GrailsDomainCl assMappingContext]: Constructor threw exception; nested exception is java.lang.NullPointerException ->> 303 | innerRun in java.util.concurrent.FutureTask$Sync - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 138 | run in java.util.concurrent.FutureTask | 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker | 908 | run in '''' ^ 662 | run . . in java.lang.Thread Caused by NullPointerException: null ->> 123 | addPersistentEntityInternal in org.grails.datastore.mapping.model.AbstractMappingContext - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 115 | addPersistentEntity in '''' | 127 | addPersistentEntityInternal in '''' | 115 | addPersistentEntity in '''' | 127 | addPersistentEntityInternal in '''' | 115 | addPersistentEntity in '''' | 303 | innerRun in java.util.concurrent.FutureTask$Sync | 138 | run in java.util.concurrent.FutureTask | 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker | 908 | run in '''' ^ 662 | run . . in java.lang.Thread

Curiosamente, el problema solo parece ser desencadenado por clases de dominio que tienen relaciones con otras clases de dominio. Si elimina todas las clases de dominio excepto SystemProperty (que no se refiere a otras clases de dominio), la aplicación se iniciará sin error.


Intente utilizar META-INF/persistence.xml ( example ) (no sé exactamente dónde colocarlo, pero en última instancia debería ir a WEB-INF/META-INF/persistence.xml , e incluir su archivo jar allí (en <jar-file> element). Luego, por supuesto, necesitarás todos los beans de primavera correspondientes ( LocalEntityManagerFactoryBean por ejemplo)


Si observa los guiones de inicio de grails ($ GRAILS_HOME $ / bin / grails y $ GRAILS_HOME $ / bin / startGrails), puede encontrar el argumento de classpath que se envía al lanzador de la aplicación grails org.codehaus.groovy.grails.cli. soporte.GrailsStarter.

Cuando ejecutas el comando grails generate-all com.model.User, el grial espera que esté disponible en la carpeta fuente o en el directorio lib. En su escenario, el jar está disponible como parte de la dependencia de Maven. Esta información no se transmite a lo largo del script de inicio de Grails. Necesitas especificar esta información.

El script de inicio tiene la opción de especificar el classpath. Por lo tanto, debe invocar el comando griales con la opción classpath que especifica la ubicación de los jar.

grails generate-all -cp E: / workspace / AppDomain.jar

También debe mencionar el contenedor con otros comandos. Ejemplo: aplicación run-app de gril -cp E: / workspace / AppDomain.jar

Necesitarás un mecanismo para obtener todas las dependencias de Maven como argumento de clase de acceso.

He probado con una clase de dominio JPA de ejemplo y esto funciona.


La documentación 1.3.7 dice

Simplemente coloque los archivos de mapeo en grails-app / conf / hibernate y coloque los archivos Java en src / java o (si el modelo de dominio está almacenado en un JAR) las clases empaquetadas en el directorio lib del proyecto.

No vi tu jar en el directorio lib en tu código fuente. ¿Podría ser esto?