gpt4 book ai didi

java - JDO(DataNucleus) 集合成员未被删除

转载 作者:行者123 更新时间:2023-11-30 11:41:01 24 4
gpt4 key购买 nike

我正在使用带有 JDO(DataNucleus) 的 GAE 1.7.0。当我保留一个具有集合属性的类时,已删除的集合成员不会从数据存储中删除。我从分离的副本中删除集合成员。新成员已正确添加,现有成员未被删除,导致我的 Collection 只增不减。

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class Parent{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;

@Persistent(defaultFetchGroup="true", dependentElement="true")
private List<Child> children = new ArrayList<Child>(0);

}

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class Child implements Serializable {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String id;

@Persistent
@Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
private String parentId;
....
}

...
parent = pm.detachCopy(resultFromQuery);
// parent looks correct in dubugger: all children are fetched (and detached)
....
parent.getChildren().clear();
parent.getChildren().addAll(newChildren);
for (Child child: parent.getChildren())
child.setParentId(KeyFactory.createKeyString("Parent", parent.getId()));
// parent looks good in the debugger: old children were removed and new ones added
...
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.currentTransaction().begin();
pm.makePersistent(parent);
pm.currentTransaction().commit();
} catch (Exception e) {
} finally {
if (pm.currentTransaction().isActive())
pm.currentTransaction().rollback();
if (!pm.isClosed())
pm.close();
}
// problem in datastore: new children were created, old ones not removed

我注意到,如果我在事务中执行查询-删除-坚持(不分离对象),那么问题就解决了。这是一个不错的临时解决方法,但我仍然想对分离的对象进行更新。

最佳答案

我不是 JDO 方面的专家,但是这里......

每个 Parent 及其相关的 Child 实体都在同一个实体组中。因此,您将需要在事务中更新数据存储,因为给定实体组的更新频率可能不会超过每秒一次。此外,在事务中,增强魔法将起作用:隐藏的、添加的 Java 字节码将处理诸如添加和删除子项以及设置字段值之类的事情。

如果您不想这样做,那么一种方法是不在 Parent 中存储 Child 实体列表;改为存储 Child ID 和/或主键的列表。这将导致每个 Child 都在其自己的实体组中。但即便如此,您也只能每秒更新一次每个 Parent(列表)。

关于java - JDO(DataNucleus) 集合成员未被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12446802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com