0

すべて、Hibernate を使用してローカルの MySQL データベース インスタンスと JPA で動作するように Google App Engine を構成しようとしています。セットアップ後、以前に議論されていることに気付いたソケットの問題があったため (http://stackoverflow.com/questions/10585140/gae-cloudsql-with-mysql-access-denied)、指示に従って問題を解決しようとしました。ただし、何らかの理由でEclipseが面倒なことをしており、前述の投稿で指示されているように、persistence.xmlファイルに加えた変更を消去します。

これをテストするために、新しい Eclipse (Juno) をインストールし、Google プラグインをロードしました。JPA を追加するテスト アプリケーションを作成し、休止状態を使用するように設定します。アプリのプロパティをグーグルで検索し、ローカル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 以外は使用できないようです。ローカル データベースへのアクセスに何を使用するかに関係なく、Google はアプリ エンジン サーバー ファームで独自のプロバイダーを使用するため、EL の使用は大きな問題ではありません。

つまり、ローカル開発にも EclipseLink を使用するのが最善の方法である可能性があります。これは、Google のプロバイダーと互換性のないコードに埋め込む可能性のある永続化プロバイダー固有のロジックは、展開後に最終的に戻ってきてコードを壊すため、より安全なアプローチはローカルで EclipesLink を使用します。

私がしたように時間を無駄にしないように、これが他の人に役立つことを願っています。

于 2012-07-23T11:31:20.423 に答える