Pergunta

Conforme o Google apresentava um novo serviço - Google Cloud Sql, decidi migrar o aplicativo da web gwt + jpa + hibernate + spring + maven para gae. Portanto, tenho um problema ao iniciar meu aplicativo localmente e no gae. Eu tenho um erro ao criar o bean dao causado por este:

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

Então me pareceu que eu estava usando jpa-1.0 em vez de jpa-2.0 com hibernação (porque jpa 1.0 falta de método:

getValidationMode ()

Eu verifiquei minhas bibliotecas ... está tudo bem - usando jpa 2.0 com hibernate-jpa-2.0-api.jar. Mas eu encontrei um problema: Quando eu uso meu código sem gae e uso outro db, tudo está ok. O fato é que appengine sdk inclui seu próprio JPA e a versão é 1.0 (cite aqui Usando JPA com App Engine )

O JPA e os JARs do armazenamento de dados estão incluídos no App Engine Java SDK. Você pode encontrá-los no diretório appengine-java-sdk / lib / user / orm /. Copie os JARs para o diretório war / WEB-INF / lib / do seu aplicativo.

Quando um aplicativo é iniciado, ele usa jpa 1.0 (sem método getValidationMode () em javax.persistence.spi.PersistenceUnitInfo) do appengine sdk em vez do meu.

Então, como posso resolver esse problema para fazer meu aplicativo usar os jars certos? Aqui está meu persistence.xml também:

   <?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>
Foi útil?

Solução

Há algum problema com o suporte Hibernate JPA, porque ele usa a especificação JPA 2.0.Mas o Google App Engine suporta apenas a especificação JPA1.0.Eu também tive o mesmo problema, pois usei o suporte do Spring Hibernate (em vez do Hibernate JPA).

Para o seu problema também, acho melhor usar o suporte do Spring Hibernate.

Outras dicas

Você deve usar uma versão mais antiga do hibernate (compatível com jpa 1).GAE força essas coisas sobre você.Na verdade, eu não sabia que ele era compatível com JPA - pensei que apenas JDO fosse compatível.

Não entendo por que você define o nome de usuário e a senha no persistence.xml.

Achei que você não precisava dessas credenciais porque o acesso do aplicativo ao banco de dados é restrito à administração do console do Google SQL Cloud, onde você especifica os IDs permitidos do aplicativo.

Se você estiver usando o eclipse, acho que um projeto GAE para java apenas copia os jars GAE para WEB-INF \ lib, remova os jars JPA do DataNucleus e Geronimo e copie seu jar Hibernate. Acho que nunca tentei fazer isso.

Boa sorte!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top