2

我使用 Datanucleus 作为 JPA 引擎对 Force.com DB 中的实体执行 CRUD。Insert 和 Select 工作正常,但是在更新新行时,正在创建并且 delete 根本不会删除记录。我正在使用以下来执行交易

在获取、修改对象然后进行更新之后,代理对象与实际对象同步是否存在某种问题。

似乎由于 ORM 层(datanucleus+force sdk)无法在更改后的对象和原始对象之间进行匹配,因此它正在创建新行。

非常感谢任何帮助。

谢谢

4

1 回答 1

0

如果您可以发布您的代码,这将有所帮助。但我猜你可能会遇到 DataNucleus 和其他 ORM(如 Hibernate)之间的已知行为差异。

你在做这样的事情吗?

MyEntity ent = new MyEntity();
ent.setId(idFromWebRequest);
ent.setXXX(valueFromWebRequest);
ent = entityManager.merge(ent);

(实例化和设置器可能由 Spring MVC 等数据绑定机制执行)。如果您这样做,它将无法与 DataNucleus 一起使用,但可以Hibernate 一起使用。对于 DataNucleus,您必须改为:

MyEntity ent = entityManager.find(MyEntity.class, idFromWebRequest);
ent.setXXX(valueFromWebRequest);
ent = entityManager.merge(ent);

我希望它像 Hibernate 一样工作,但 DataNucleus 团队认为这是正确的行为。也许他们可以插话。我相信这是您何时将实体视为新实体与分离实体的问题。如果您的实体实例已分离,则对其调用合并应该重新附加它,并且您的数据库行将在事务提交/刷新时更新。如果它是一个新实例,那么实体管理器将始终创建一个新记录。

至于你的删除问题,我不知道它可能是什么。也许您可以发布代码示例?您可以在此处找到使用 JPA 提供程序的完整 CRUD 示例应用程序:

https://github.com/forcedotcom/javasample-musiclib

于 2011-05-18T16:08:10.720 回答