使用JDO在Google App Engine中存储对象

时间:2012-06-11 20:46:39

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

我正在使用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;        
  }

任何解决问题的想法?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

请问您是否已将用户实体(idUser)的主键设置为creaUtente()函数?

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