我在使用Google Cloud SQL上的JPA时遇到问题。我得到了一个java.lang.NoClassDefFoundError:java.io.FileWriter,这是Google App Engine确实不支持的类。
我仔细按照https://developers.google.com/eclipse/docs/cloudsql-jpatools上的说明使用EclipseLink 2.4.1 - Juno(我在Linux Mint 14上运行Eclipse Juno)
我也尝试过使用EclipseLink 2.3.3 - Indigo,但效果相同。
我知道Google Cloud SQL数据库正在运行,因为我尝试使用JDBC访问:https://developers.google.com/appengine/docs/java/cloud-sql/developers-guide 并且按预期工作。
调用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上以开发者模式在本地运行代码,但我使用的是远程Cloud SQL库,因为我没有安装本地MySQL。
此链接JPA with Google Cloud SQL "NoClassDefFoundError: java.util.prefs.Preferences is a restricted class"似乎谈论了类似的问题,但我已经检查过我的persistence.xml包含com.google.appengine.api.rdbms.AppEngineDriver,因此该解决方案无法解决我的问题。
非常感谢任何帮助!
[编辑] 进一步的观察:
某处(我找不到参考资料)我偶然发现EclipseLink完全是多余的,因为JPA对Google Cloud SQL(以及HRD)的支持已经在DataNucleus包中。有人能证实吗?