2

Google が新しいサービスである Google Cloud Sql を発表したので、gwt+jpa+hibernate+spring+maven Web アプリケーションを gae に移行することにしました。そのため、ローカルおよびゲーでアプリを起動するときに問題が発生します。これが原因でdao Beanの作成中にエラーが発生しました:

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

そのため、休止状態で jpa-2.0 の代わりに jpa-1.0 を使用しているように思えました (jpa 1.0 にはメソッドがないため:

getValidationMode()

ライブラリをチェックしました...すべて問題ありません-hibernate-jpa-2.0-api.jarでjpa 2.0を使用しています。しかし、私は問題を見つけました.gaeなしでコードを使用し、別のdbを使用すると、すべて問題ありません。実際には、appengine sdk には独自の JPA が含まれており、バージョンは 1.0 です (ここからの引用Using JPA with App Engine )

JPA およびデータストア JAR は、App Engine Java SDK に含まれています。それらは appengine-java-sdk/lib/user/orm/ ディレクトリにあります。JAR をアプリケーションの war/WEB-INF/lib/ ディレクトリにコピーします。

アプリケーションが起動すると、私の代わりに appengine sdk の jpa 1.0 (javax.persistence.spi.PersistenceUnitInfo のメソッド getValidationMode() なし) を使用します。

では、この問題を解決して、アプリで正しい jar を使用するにはどうすればよいでしょうか? ここに私の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>
4

4 に答える 4

4

JPA 2.0 仕様を使用しているため、Hibernate JPA サポートには問題があります。ただし、Google App Engine は JPA1.0 仕様のみをサポートしています。私も同じ問題を抱えていました.Spring Hibernateサポート(Hibernate JPAの代わりに)を使用したためです。

あなたの問題についても、Spring Hibernate サポートを使用する方がよいと思います。

于 2011-10-20T16:01:40.260 に答える
1

古いバージョンの hibernate を使用する必要があります (jpa 1 と互換性があります)。GAE はこれらのことを強制します。実際、JPAをサポートしているとは知りませんでした.JDOのみがサポートされていると思っていました。

于 2011-10-20T09:59:30.913 に答える
0

Eclipseを使用している場合、Java用のGAEプロジェクトはGAEjarをWEB-INF\ libにコピーし、DataNucleusとGeronimoからJPA jarを削除して、Hibernatejarをコピーするだけだと思います。私はこれを試したことがないと思います。

幸運を!

于 2011-12-30T02:31:21.017 に答える