【问题标题】:How can I save a list in google-app-engine database?如何在 google-app-engine 数据库中保存列表?
【发布时间】:2014-08-11 18:58:47
【问题描述】:

我的以下代码无法正常工作。 testprovincia 存在于数据库中,partidos 变量是一个列表,我确信它不是空的,但也不会持久化。

mgr = getPersistenceManager();
Query query = mgr.newQuery(Provincia.class);
query.setFilter("name == nameParam");
query.declareParameters("String nameParam");
List<Provincia> results = (List<Provincia>) query.execute("testprovincia");
Provincia prov = results.get(0);

insertPartidos(partidos);

prov.setPartidos(partidos);
mgr.makePersistent(prov);
query.closeAll();
mgr.close();

插入Partidos 方法:

private void insertPartidos(List<Partido> partidos){
    for (Partido partido : partidos) {
        log.info(partido.getName());
        mgr.makePersistent(partido);
    }
}

问题是为什么我从来没有看到我添加到数据库上的 prov 变量的列表?总是空的。

这是我的课程:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Provincia {

    public Provincia(String name) {
        super();
        this.name = name;
    }

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key id;
    @Persistent
    private String name;
    @Persistent(mappedBy = "provincia")
    @Order(extensions = @Extension(vendorName="datanucleus",key="list-ordering", value="name asc"))
    private List<Partido> partidos;

    public Key getId() {
        return id;
    }
    public void setId(Key id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<Partido> getPartidos() {
        return partidos;
    }
    public void setPartidos(List<Partido> partidos) {
        this.partidos = partidos;
    }
}

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Partido {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key id;
    @Persistent
    private String name;

    @Persistent
    private Provincia  provincia;

    public Partido(){
    }

    public Partido(Key id) {
        super();
        this.id = id;
    }

    public Partido(Key id, String name, Provincia prov) {
        super();
        this.id = id;
        this.name = name;
        this.provincia = prov;
    }

    public Partido(String name, Provincia prov) {
        super();
        this.name = name;
        this.provincia = prov;
    }

    public Key getId() {
        return id;
    }

    public void setId(Key id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Provincia getProvincia() {
        return provincia;
    }

    public void setProvincia(Provincia provincia) {
        this.provincia = provincia;
    }

}

【问题讨论】:

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


    【解决方案1】:

    也许使用其他更新方式。如果 testprovincia 已经存在,使用here 描述的方法可能会为您解决问题。不要使用 makepersistent,而是使用持久性管理器获取数据并直接更新它。

    here 所解释的那样,还是使用标准数据存储的 db(或 ndb)put?你真的需要 JDO 吗?

    【讨论】:

    • 我添加了更多信息,也许我对使用相同的 mgr 变量进行持久化的 previus 插入有问题。我像你描述的那样更改了代码,但我遇到了同样的情况。
    • 你没有使用正确的方法。我说的是他们不使用 makePersistent 而是使用持久性管理器通过 ID 获取对象,然后只更新对象的一种。我提供的第一个链接,您将看到的第一个 sn-p 代码。
    • 如果我使用例如 Provincia prov = mgr.getObjectById(Provincia.class, "province name");我无法检索实体,出现异常
    • 否,但我再次更改代码以将名称转换为键,但是您不能将字符串作为键并同时在您的班级中有孩子,您会遇到异常.所以我会回到旧代码,在这里我必须问,因为太疯狂了,我必须先从查询中加载省份,然后用你指向我的代码再次加载同一个省份?最后尝试使用列表更新省份...
    • 如果你没有预先设定省份并且这是你的关键,是的,这可能是一种方法......听起来有点循环,但它会让你尝试其他 PM 方法。
    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2011-08-12
    相关资源
    最近更新 更多