1

我在 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 与 Google Cloud SQL "NoClassDefFoundError: java.util.prefs.Preferences is a restricted class"似乎谈到了类似的问题,但我已经检查过我的 persistence.xml 是否包含 com.google.appengine.api.rdbms。 AppEngineDriver,因此该解决方案无法解决我的问题...

任何帮助都感激不尽!

[编辑] 一些进一步的观察:

  • EclipseLink 的包含阻止了对 HRD 的 JDO 访问 - 当我尝试时,我在 javax.jdo.JDOHelper 上收到类加载器错误
  • 删除 WEB-INF/lib 中的 JPA facet 和 eclipselink jar 使 NoClassDefFoundError 消失,并使代码完成所有步骤(开始、持久、提交)。但是,现在记录被写入本地的 dev.mode HRD 数据存储(local_db.bin)?所以也许问题是我如何让 DataNucleus JPA 使用 Cloud SQL ?

在某个地方(我找不到参考资料)我偶然发现 EclipseLink 完全是多余的,因为对 Google Cloud SQL(以及 HRD)的 JPA 支持已经在 DataNucleus 包中。有人可以证实这一点吗?

4

0 回答 0