我使用 Datanucleus 作为 JPA 引擎对 Force.com DB 中的实体执行 CRUD。Insert 和 Select 工作正常,但是在更新新行时,正在创建并且 delete 根本不会删除记录。我正在使用以下来执行交易
在获取、修改对象然后进行更新之后,代理对象与实际对象同步是否存在某种问题。
似乎由于 ORM 层(datanucleus+force sdk)无法在更改后的对象和原始对象之间进行匹配,因此它正在创建新行。
非常感谢任何帮助。
谢谢
我使用 Datanucleus 作为 JPA 引擎对 Force.com DB 中的实体执行 CRUD。Insert 和 Select 工作正常,但是在更新新行时,正在创建并且 delete 根本不会删除记录。我正在使用以下来执行交易
在获取、修改对象然后进行更新之后,代理对象与实际对象同步是否存在某种问题。
似乎由于 ORM 层(datanucleus+force sdk)无法在更改后的对象和原始对象之间进行匹配,因此它正在创建新行。
非常感谢任何帮助。
谢谢
如果您可以发布您的代码,这将有所帮助。但我猜你可能会遇到 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 示例应用程序: