【问题标题】:Storing object in Google App Engine using JDO使用 JDO 在 Google App Engine 中存储对象
【发布时间】:2012-06-14 18:47:03
【问题描述】:

我正在使用 Google App Engine,但是当我尝试在数据存储中存储对象时遇到了一些问题。 我正在使用 Eclipse Indico 平台、JDO 来描述我想要存储的对象以及用于用户界面的 JSF 技术。 当我在 ecliplse 平台上运行我的应用程序时,有时它工作正常(对象存储正确),有时它不起作用,当代码执行时没有任何反应(也没有错误消息),如果我删除文件 war/WEB -INF/appengine-generated/local_db.bin 在执行之前不会重新创建它。 当我在 Google App Engine 上运行相同的应用程序时,问题是相同的:在执行期间没有任何反应,或者有时最后存储的对象被最后一个对象替换。 我不明白为什么同一个应用程序,没有任何改变就可以工作,而没有理由就不能工作。

这是我的对象之一(getter 和 setter 方法被省略):

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long idUser; 
@Persistent
private String email;
@Persistent
private String name;
@Persistent
private String surname;
@Persistent
private String password;

这是我用来存储对象的代码:

public Utente creaUtente(User user) {
    PersistenceManager pm = PMF.get().getPersistenceManager();

    try {
        user = pm.makePersistent(user);
    } catch (Exception e) {        // TODO: handle exception
        System.out.println(e.getMessage() + "DB-creaUtente");
    }
    finally{
        pm.close();
    }
    return user;        
  }

有解决问题的办法吗?

【问题讨论】:

    标签: java google-app-engine jsf jdo datastore


    【解决方案1】:

    您有 2 个问题,首先是您使用了带有通用 catch 的 try 块,因此所有错误都不会报告,因为您无法在 App Engine 中使用 System.out.println。您需要使用应用引擎logging service 来查看错误。或者,如果应用程序仍在开发中,您可以消除所有通用 try 块,以便获得真正的堆栈跟踪。

    至于为什么它不能 100% 工作,那里没有足够的代码让我诊断它。

    【讨论】:

    • 您仍然可以在 AppEngine 中使用 System.out.println,但不推荐。 out.println 将写入 INFO 级别,error.println 将写入 WARNING 级别。
    • 在这种情况下也没有任何反应。我尝试在 Eclipse 平台上以调试模式执行应用程序,但执行被中断,因为存在“找不到源”。特别是问题是类 NativeConstructorAccessorImpl.newInstance(Object[]) 行:不可用。 Eclipse 没有正常显示此类,而是显示:“未找到源”。和一个按钮“编辑源查找路径...”。即使在调试模式下,控制台也没有错误。这个类是问题的原因吗?
    • DataNucleus(调试级别)的日志会告诉您 makePersistent 调用的确切作用。有大量关于使用 JDK1.4 日志记录来识别它的创建位置的文档。
    【解决方案2】:

    我无法回答为什么稍后创建的用户会覆盖先前根据您提供的代码创建的用户,但我怀疑这与您传入的参数 USER 有关。

    您能否检查一下您是否已将用户实体 (idUser) 的主键设置为 creaUtente() 函数?

    由于 User 类的主键是自动生成的,您应该将其留空,系统会为您生成 id。如果您提供一个 id,那么第二次写入将覆盖现有的,因为它们共享相同的 id。

    【讨论】:

    • 我没有在 creaUtente() 函数中设置 userId。在我的 JSF java bean 中,我创建了一个 User 对象,然后设置了它的参数(除了 id 之外的所有参数),然后我调用了 creaUtente(user) 方法。
    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多