Hibernate JPA&x2B;休眠谷歌云Sql

Hibernate JPA&x2B;休眠谷歌云Sql,hibernate,maven,google-app-engine,jpa,google-cloud-sql,Hibernate,Maven,Google App Engine,Jpa,Google Cloud Sql,随着谷歌推出新服务——谷歌云Sql,我决定将gwt+jpa+hibernate+spring+maven web应用程序迁移到gae。 因此,我在本地和gae上启动应用程序时遇到问题。 我在创建dao bean时出错,原因如下: [ERROR] Caused by: java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/Va

随着谷歌推出新服务——谷歌云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)
所以在我看来,我在hibernate中使用jpa-1.0而不是jpa-2.0(因为jpa 1.0缺少方法:

getValidationMode()

我检查了我的libs…一切正常-使用jpa2.0和hibernate-jpa-2.0-api.jar。 但我发现了一个问题: 当我在没有gae的情况下使用我的代码,并且使用另一个db时,一切都没问题。事实是appengine sdk包含自己的JPA,版本是1.0(引自此处)

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()方法),而不是我的方法

那么,我如何克服这个问题,让我的应用程序使用正确的罐子呢? 以下是我的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>

org.hibernate.ejb.HibernatePersistence

您应该使用旧版本的hibernate(与JPA1兼容).GAE将这些东西强加给你。实际上我不知道它支持JPA-我以为只支持JDO。

Hibernate JPA支持有一些问题,因为它使用JPA 2.0规范。但是Google App Engine只支持JPA1.0规范。我也有同样的问题,因为我使用了Spring Hibernate支持(而不是Hibernate JPA)


对于您的问题,我认为最好使用Spring Hibernate支持。

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


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

如果您使用eclipse,我认为java的GAE项目只需将GAE JAR复制到WEB-INF\lib,从DataNucleus、Geronimo和cop中删除JPA JAR你的冬眠罐。 我猜我从来没有试过这个


祝你好运!

是的,hiebrnate的旧版本是一种方式,但可能还有另一种方式?)gae使用不完整JPA的另一个问题。我的问题是如何绕过gae的JPA使用JPA 2.0。@BraginiNI:“gae使用不完整JPA”-事实上是不正确的。如果你坚持使用gae的JPA实现(对于BigTable)然后,它只支持一些JPA映射/API(显然,因为JPA是专为RDBMS设计的),但它支持对该数据存储有意义的内容。您使用的是RDBMS,因此不相关。我更喜欢创建一个自定义用户,而不是使用根用户。您还可以在其中找到有用的信息,这在实践中意味着什么?