Domanda

Quando Google ha presentato un nuovo servizio, Google Cloud Sql, ho deciso di migrare l'applicazione web gwt + jpa + hibernate + spring + maven a gae. Quindi ho un problema durante l'avvio della mia app in locale e su gae. Ho un errore durante la creazione del bean dao causato da questo:

     [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)

Quindi mi è sembrato di usare jpa-1.0 invece di jpa-2.0 con hibernate (perché jpa 1.0 manca di metodo:

getValidationMode ()

Ho controllato le mie librerie ... va tutto bene - usando jpa 2.0 con hibernate-jpa-2.0-api.jar. Ma ho trovato un promlem: Quando uso il mio codice senza gae e uso un altro db, tutto va bene. Il fatto è che appengine sdk include il proprio JPA e la versione è 1.0 (citazione da qui Utilizzo di JPA con App Engine )

I JAR JPA e datastore sono inclusi con l'SDK Java di App Engine. Puoi trovarli nella directory appengine-java-sdk / lib / user / orm /. Copia i JAR nella directory war / WEB-INF / lib / della tua applicazione.

Quando un'applicazione si avvia, utilizza jpa 1.0 (senza metodo getValidationMode () in javax.persistence.spi.PersistenceUnitInfo) da appengine sdk invece del mio.

Quindi, come posso risolvere questo problema per fare in modo che la mia app utilizzi i barattoli giusti? Ecco anche il mio persistence.xml:

   <?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>
È stato utile?

Soluzione

Si è verificato un problema con il supporto JPA Hibernate, perché utilizzava le specifiche JPA 2.0.Ma Google App Engine supporta solo la specifica JPA1.0.Ho anche avuto lo stesso problema, perché ho usato il supporto Spring Hibernate (invece di Hibernate JPA).

Anche per il tuo problema penso sia meglio usare il supporto Spring Hibernate.

Altri suggerimenti

Dovresti usare una versione precedente di hibernate (compatibile con jpa 1).GAE ti impone queste cose.In realtà non sapevo che supportasse JPA - pensavo fosse supportato solo JDO.

I don't understand why you define username and password in the persistence.xml.

I thougth that you didn't need those credentials cause the app access to DB is restricted from console administration of Google SQL Cloud, where you specify allowed app's IDs.

If you are using eclipse, I think that a GAE project for java just copies the GAE jars to the WEB-INF\lib, remove the JPA jars from DataNucleus and Geronimo and copy your Hibernate jar. I never tried this I am guessing.

Good luck!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top