用于makeTransient的Datanucleus / JDO InstanceLifecycleListener(或通过查询加载)

时间:2019-02-17 21:11:38

标签: jdo datanucleus

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

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

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

另一种方法是在对象变为“瞬态”时捕获。我也找不到这样做!

pm.makeTransientAll(col,true);

有什么想法吗?

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

1 个答案:

答案 0 :(得分:0)

以下是我发现的许多调试信息:

1)如果 DEFAULT 提取组(又名METADATA default-fetch-group)已从中删除,则查询不会触发任何 InstanceLifecycleListener (除非已删除元素)。 PersistentManager (在查询之前)。换句话说:一个人不能使用 pm.getFetchPlan()。clearGroups()方法,或者一个人必须在执行查询之前将 DEFAULT 提取组添加回去。因此,...如果需要定义程序化提取组,则需要考虑到将会(必须!)存在DEFAULT提取组(aka,元数据中定义的所有字段!)。 > InstanceLifecycleListener 开始工作。

解决方法是仅使用键定义默认获取组(需要),然后更改逻辑即可使用。我到底做了什么...结果?

2) getObjectById 方法停止触发 postLoad !!!调试后,我发现要使用此功能,默认获取计划必须定义除KEY字段之外的另一个字段!

完全缺少有关FETCH GROUPS影响InstanceLifecycleListener触发方式的信息,并且Apache JDO(至少)应该修改其工作方式(至少是DOCS),以便JDO用户这样做不会为实施而烦恼。