2

由于 Google 推出了新服务 - Google Cloud Sql,我决定将 gwt+jpa+hibernate+spring+maven Web 应用程序迁移到 gae。所以我在本地和 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-1.0 而不是 jpa-2.0 和休眠(因为 jpa 1.0 缺少方法:

获取验证模式()

我检查了我的库...一切正常 - 使用 jpa 2.0 和 hibernate-jpa-2.0-api.jar。但是我发现了一个问题:当我在没有 gae 的情况下使用我的代码并使用另一个数据库时,一切都很好。事实是 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())。

那么,我怎样才能解决这个问题,让我的应用程序使用正确的 jars?这也是我的 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

Hibernate JPA 支持存在一些问题,因为它使用了 JPA 2.0 规范。但是 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

我不明白你为什么在persistence.xml 中定义用户名和密码。

我认为您不需要这些凭据,因为应用程序对 DB 的访问受到 Google SQL Cloud 控制台管理的限制,您可以在其中指定允许的应用程序 ID。

于 2011-10-28T22:30:41.573 回答
0

如果您使用的是 Eclipse,我认为 Java 的 GAE 项目只是将 GAE jar 复制到 WEB-INF\lib,从 DataNucleus 和 Geronimo 中删除 JPA jar,然后复制您的 Hibernate jar。我猜我从来没有试过这个。

祝你好运!

于 2011-12-30T02:31:21.017 回答