我使用apache.JDO / w DataNucleus建立了一个小项目。我可以在没有任何问题的情况下保存数据,但在尝试更新或删除它时我遇到了困难。
方案如下:
@PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id;
在Google App Engine中,相同的方案给了我更新(预期结果 - 见下文)。
我还会给你一个小代码示例来举例说明我的问题:
PersistenceManager pm = PMF.getPM(); Option dao = new Option(String.class, "field", "A"); pm.makePersistent(dao); pm.close(); System.out.println("1"); for (Object o : Model.findAll(Option.class)) System.out.println(((Option) o).getValue()); dao.setValue("B"); pm = PMF.getPM(); pm.makePersistent(dao); pm.close(); System.out.println("2"); for (Object o : Model.findAll(Option.class)) System.out.println(((Option) o).getValue()); pm = PMF.getPM(); pm.makePersistent(dao); pm.deletePersistent(dao); pm.close(); System.out.println("3"); for (Object o : Model.findAll(Option.class)) System.out.println(((Option) o).getValue());
我希望输出为:
1 A 2 B 3
但相反它给了我:
1 A 2 A B 3 A B
关于我做错了什么的任何建议? (顺便说一句,我使用非事务性RW,启用了RetainValues)
答案 0 :(得分:0)
我已经解决了我的问题(@point 2)
pm = PMF.getPM(); dao = pm.getObjectById(DO.class, 1L); dao.setValue("B"); pm.makePersistent(dao); pm.close();
但如果我有70-100个字段,这个解决方案有点昂贵,因为我必须分别设置每个字段。
我还没有手动完成,但有反射 - 但是那么DataNucleus优于Hibernate的优势是什么? - 据我所知,它也使用运行时内省。
如果我错了,请纠正我 - 我还是这个领域的新手......但是:)
答案 1 :(得分:0)
您不需要致电makePersistent
agian。
long id = objectId; //Id of the object you want to update.
pm = PMF.getPM();
DO dao = pm.getObjectById(DO.class, id);
dao.setValue("B");
pm.close();
要删除,请执行此操作;
long id = objectId; //Id of the object you want to delete.
pm = PMF.getPM();
DO dao = pm.getObjectById(DO.class, id);
pm.deletePersistent(dao);
pm.close();
您没有使用事务提交。您可以查看DataNucleus docs