GAE,JPA和Hibernate设置问题

时间:2012-07-20 15:52:41

标签: eclipse hibernate google-app-engine jpa

全部, 我正在尝试使用Hibernate配置Google App Engine以使用我的本地MySQL数据库实例和JPA。 设置后,我遇到了一个套接字问题,我之前已经讨论过这个问题(http://stackoverflow.com/questions/10585140/gae-cloudsql-with-mysql-access-denied),所以我按照说明操作,试图解决我的问题。但是出于某种原因,eclipse正在做一些令人讨厌的事情并且消除了我对persistence.xml文件所做的更改,正如在上述帖子中所指示的那样。

为了测试这个,我安装了一个新的Eclipse(Juno)并加载了谷歌插件。 我创建了一个测试应用程序 我将JPA添加到is并将其设置为使用hibernate。 我谷歌应用程序属性我确保它使用本地mysql

到目前为止一切顺利。当我查看生成的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_1_0.xsd" version="1.0">
    <persistence-unit name="transactions-optional" transaction-type="RESOURCE_LOCAL">
    <provider></provider>
        <properties>
            <property name="datanucleus.NontransactionalRead" value="true"/>
            <property name="datanucleus.NontransactionalWrite" value="true"/>
            <property name="datanucleus.ConnectionURL" value="appengine"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/shelem?user=root&amp;password=gandom"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="gandom"/>
        </properties>
    </persistence-unit>
</persistence>

正如您所看到的那样,提供程序设置为空(错误),URL和驱动程序属性也是错误的(如上所述)。 如果我按原样运行应用程序,我将获得上面帖子中提到的套接字错误异常,因此我手动将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_1_0.xsd" version="1.0">
    <persistence-unit name="transactions-optional" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <properties>
            <property name="datanucleus.NontransactionalRead" value="true"/>
            <property name="datanucleus.NontransactionalWrite" value="true"/>
            <property name="datanucleus.ConnectionURL" value="appengine"/>
            <property name="javax.persistence.jdbc.driver" value="com.google.appengine.api.rdbms.AppEngineDriver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:google:rdbms://localhost/Guardian"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="gandom"/>
        </properties>
    </persistence-unit>
</persistence>

然后疯狂的事情发生了!一旦我这样做,我清理/构建应用程序,所以我可以启动它Eclipse清除我的更改并将persistence.xml文件看起来像我手动更改之前的那样..... 有趣的是,如果我添加注释或更改任何其他内容,这些更改将被保留并且不会丢失,因此出于某种原因,eclipse似乎只替换了建议修复我的问题的代码!!!

这让我发疯,有人见过这个吗?有什么建议吗?

感谢您的评论。

阿米尔

1 个答案:

答案 0 :(得分:1)

至少在应用引擎版本1.7中,除了EclipseLink作为持久性提供程序之外,你不能使用任何东西。使用EL不是主要问题,因为无论用于访问本地数据库的是什么,Google都会在应用引擎服务器场上使用自己的提供商。

即使最好也使用EclipseLink进行本地开发,因为任何与您的代码中嵌入的与谷歌提供商不兼容的持久性提供程序特定逻辑最终都会回来并在部署后破坏您的代码,因此更安全的方法是在本地使用EclipesLink。

希望这有助于他人,所以他们不会像我一样浪费时间。