makeTransient的Datanucleus / JDO InstanceLifecycleListener(或查询加载)

问题描述 投票:-1回答:1

我有一个问题,我需要使用DATANUCLEUS(JDO)解决,可能是JDO规范未涵盖的限制。

我需要捕获何时在查询中加载对象 - 没有InstanceLifecycleListener! (查询对象毕竟应被视为LOADED对象 - 它们可以被更改,分离等)

Query query=pm.newQuery(...);
Collection col=(Collection)query.execute();

另一种方法是捕捉物体何时变为瞬态。我发现也没办法做到这一点!

pm.makeTransientAll(col,true);

有任何想法吗?

对于分离的Query元素,我在PMF上使用DetachLifecycleListener,它监听DETACH方法。这是我发现使InstanceLifecycleListener处理查询的唯一方法。

jdo datanucleus
1个回答
0
投票

这是我在很多DEBUG中发现的:

1)如果在查询之前从PersistentManager中删除了DEFAULT获取组(也称为METADATA default-fetch-group),则查询不会触发任何InstanceLifecycleListener(除非元素是DETACHED)。换句话说:一个人不能使用pm.getFetchPlan()。clearGroups()方法,或者必须在执行查询之前重新添加DEFAULT提取组。所以......如果需要定义一个程序化的提取组,它需要考虑DEFAULT提取组将(必须!)存在(也就是说,元数据中定义的所有字段!)InstanceLifecycleListener工作。

解决方法是仅使用KEY(它是必需的)来定义DEFAULT获取组,只需更改逻辑即可使用它。我到底做了什么......结果呢?

2)getObjectById方法STOPS触发postLoad !!!在调试之后我发现为了这个工作,DEFAULT获取计划必须定义除KEY之外的另一个字段!

完全没有关于FETCH GROUPS影响InstanceLifecycleListener触发方式的方式的信息,而且Apache JDO(至少)应该修改它的工作方式(或者至少是DOCS),以便JDO用户不去坚果与实施。

© www.soinside.com 2019 - 2024. All rights reserved.