Google Cloud SQL で JPA を使用すると問題が発生します。java.lang.NoClassDefFoundError: java.io.FileWriter というエラーが表示されますが、これは実際には Google App Engine でサポートされていないクラスです。
EclipseLink 2.4.1 - Juno を使用してhttps://developers.google.com/eclipse/docs/cloudsql-jpatoolsの指示に注意深く従いました(Linux Mint 14 で Eclipse Juno を実行しています) 。
代わりに EclipseLink 2.3.3 - Indigo も使用してみましたが、結果は同じでした。
https://developers.google.com/appengine/docs/java/cloud-sql/developers-guideに従ってJDBCアクセスを使用しようとしたため、Google Cloud SQLデータベースが機能していることはわかっていますが 、期待どおりに機能しました.
JPA を呼び出す最初のメソッドは次のとおりです。
public static void createBookJPA(BookJPA c)
{
logger.info("Entering createBookJPA: [" + c.getIsbn() + "," + c.getBookName() + "]");
EntityManager mgr = EMF.get().createEntityManager();
try
{
logger.info("before begin");
mgr.getTransaction().begin();
logger.info("before persist");
mgr.persist(c);
logger.info("before commit");
mgr.getTransaction().commit();
logger.info("after commit");
}
finally
{
mgr.close();
}
logger.info("Exiting createBookJPA");
}
ログにこれを与える:
feb 15, 2013 2:29:25 PM dk.lundogbendsen.schoubo.gae.ex5demo.BookService createBookJPA
INFO: Entering createBookJPA: [JPA:978-1-849690-44-7,Google App Engine Java and GWT Application Development]
[EL Info]: 2013-02-15 14:29:25.79--ServerSession(619728523)--EclipseLink, version: Eclipse Persistence Services - 2.4.1.v20121003-ad44345
[EL Info]: connection: 2013-02-15 14:29:29.088--ServerSession(619728523)--file:/home/jschoubo/Interests/Softfact/Develop/GAE/eclipseworkspaceGAE/lobGAE/war/WEB-INF/classes/_transactions-optional login successful
[EL Severe]: ejb: 2013-02-15 14:29:30.333--ServerSession(619728523)--java.lang.NoClassDefFoundError: java.io.FileWriter is a restricted class. Please see the Google App Engine developer's guide for more details.
feb 15, 2013 2:29:30 PM dk.lundogbendsen.schoubo.gae.ex5demo.LobGAEEx5DemoSQLJPA createAuthor
WARNING: java.lang.NoClassDefFoundError: java.io.FileWriter is a restricted class. Please see the Google App Engine developer's guide for more details.
コードは Jetty の開発者モードでローカルに実行しますが、ローカルの MySQL がインストールされていないため、リモートの Cloud SQL ベースを使用しています。
このリンクJPA with Google Cloud SQL "NoClassDefFoundError: java.util.prefs.Preferences is a limited class"は同様の問題について話しているようですが、persistence.xml に com.google.appengine.api.rdbms が含まれていることを既に確認しました。 AppEngineDriver、そのため、解決策は私の問題を解決しません...
どんな助けでも大歓迎です!
[編集] いくつかのさらなる観察:
- EclipseLink を含めると、HRD への JDO アクセスが機能しなくなります。試行すると、javax.jdo.JDOHelper でクラス ローダー エラーが発生します。
- JPA ファセットと WEB-INF/lib の eclipselink jar を削除すると、NoClassDefFoundError がなくなり、コードがすべてのステップ (開始、永続化、コミット) を通過するようになりました。ただし、レコードはローカルの dev.mode HRD データストア (local_db.bin) に書き込まれるようになりましたか? 問題は、DataNucleus JPA で Cloud SQL を使用する方法です。
Google Cloud SQL (および HRD) の JPA サポートは DataNucleus パッケージに既に含まれているため、どこか (参照が見つかりません) で、EclipseLink は完全に不必要であるという発言に出くわしました。誰かがこれを確認できますか?