我使用Datanucleus作为JPA引擎在Force.com DB中的实体上执行CRUD。 “插入”和“选择”工作正常,但更新新行时会创建,删除不会删除记录。我正在使用以下内容进行交易执行
在获取,修改对象并进行更新后,代理对象与实际对象同步是否存在问题。
似乎由于ORM层(datanucleus + force sdk)无法在更改的对象和原始对象之间进行匹配,因此它正在着陆创建新行。
非常感谢任何帮助。
谢谢
答案 0 :(得分:0)
如果您可以发布您的代码,这将有所帮助。但我猜你可能会在DataNucleus和其他ORM(如Hibernate)之间的行为上发生已知的差异。
你在做这样的事吗?
MyEntity ent = new MyEntity();
ent.setId(idFromWebRequest);
ent.setXXX(valueFromWebRequest);
ent = entityManager.merge(ent);
(实例化和setter可能由Spring MVC等数据绑定机制执行)。如果你这样做,它将不使用DataNucleus,但它将与Hibernate一起使用。对于DataNucleus,您必须改为:
MyEntity ent = entityManager.find(MyEntity.class, idFromWebRequest);
ent.setXXX(valueFromWebRequest);
ent = entityManager.merge(ent);
我希望它像Hibernate一样工作,但DataNucleus团队认为这是正确的行为。也许他们可以插话。我认为这是一个问题,当你认为一个实体是一个新实体而不是一个独立的实体。如果你的实体实例是分离的,那么在它上面调用merge应该重新附加它,你的数据库行将在事务提交/刷新时更新。如果它是一个新实例,那么实体管理器将始终创建一个新记录。
至于你的删除问题,我不知道它是什么。也许您可以发布代码示例?您可以在此处使用JPA提供程序找到完整的CRUD示例应用程序: