Pregunta

Cuando Google presentó un nuevo servicio, Google Cloud Sql, decidí migrar la aplicación web gwt + jpa + hibernate + spring + maven a gae. Entonces tengo un problema al iniciar mi aplicación localmente y en gae. Tengo un error al crear dao bean causado por esto:

     [ERROR] Caused by: java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
[ERROR]     at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:625)
[ERROR]     at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
[ERROR]     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:225)
[ERROR]     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
[ERROR]     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
[ERROR]     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)

Entonces me pareció que estaba usando jpa-1.0 en lugar de jpa-2.0 con hibernate (porque jpa 1.0 carece de método:

getValidationMode ()

Revisé mis bibliotecas ... todo está bien, usando jpa 2.0 con hibernate-jpa-2.0-api.jar. Pero encontré un promlem: Cuando uso mi código sin gae y uso otro db, todo está bien. El hecho es que appengine sdk incluye su propio JPA y la versión es 1.0 (cita de aquí Uso de JPA con App Engine )

Los JAR de almacén de datos y JPA se incluyen con el SDK de Java de App Engine. Puede encontrarlos en el directorio appengine-java-sdk / lib / user / orm /. Copie los archivos JAR en el directorio war / WEB-INF / lib / de su aplicación.

Cuando se inicia una aplicación, usa jpa 1.0 (sin el método getValidationMode () en javax.persistence.spi.PersistenceUnitInfo) de appengine sdk en lugar del mío.

Entonces, ¿cómo puedo solucionar este problema para que mi aplicación use los frascos adecuados? Aquí está mi persistence.xml también:

   <?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
      http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">

        <!-- A JPA Persistence Unit -->
        <persistence-unit name="PersistenceUnit"
            transaction-type="RESOURCE_LOCAL">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>

            <properties>
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
                <property name="hibernate.hbm2ddl.auto" value="update" />
                <property name="hibernate.show_sql" value="true" />
                <property name="hibernate.connection.url" value="jdbc:google:rdbms://bragininim:test/test"></property>
                <property name="hibernate.connection.driver_class"
                    value="com.google.appengine.api.rdbms.AppEngineDriver"></property>

                <!-- Connection -->
                <property name="hibernate.connection.username" value="****" />
                <property name="hibernate.connection.password" value="****" />

            </properties>
        </persistence-unit>

    </persistence>
¿Fue útil?

Solución

Existe algún problema con el soporte de Hibernate JPA, porque utiliza la especificación JPA 2.0.Pero Google App Engine solo admite la especificación JPA1.0.También tuve el mismo problema, utilicé el soporte de Spring Hibernate (en lugar de Hibernate JPA).

Para su problema también creo que es mejor usar el soporte de Spring Hibernate.

Otros consejos

Debería utilizar una versión anterior de hibernate (compatible con jpa 1).GAE te impone estas cosas.En realidad, no sabía que es compatible con JPA; pensé que solo se admite JDO.

No entiendo por qué define el nombre de usuario y la contraseña en persistence.xml.

Creo que no necesita esas credenciales porque el acceso de la aplicación a la base de datos está restringido desde la administración de la consola de Google SQL Cloud, donde especifica los ID de la aplicación permitidos.

Si está usando eclipse, creo que un proyecto GAE para java simplemente copia los archivos GAE en WEB-INF \ lib, elimine los archivos JPA de DataNucleus y Geronimo y copie su archivo Hibernate. Supongo que nunca probé esto.

¡Buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top