0

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

为了测试这一点,我安装了一个新的 Eclipse (Juno) 并加载了谷歌插件。我创建了一个将 JPA 添加到 is 的测试应用程序,并将其设置为使用休眠。我谷歌应用程序属性我确保它使用本地 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 只替换了建议解决我的问题的代码!!!

快把我逼疯了,有人看过吗?有什么建议么?

感谢您的意见。

阿米尔

4

1 回答 1

1

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

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

希望这对其他人有所帮助,这样他们就不会像我一样浪费时间。

于 2012-07-23T11:31:20.423 回答