Collections Datanucleus查询:关闭后访问临时收集

Collections Datanucleus查询:关闭后访问临时收集,collections,jdo,datanucleus,transient,Collections,Jdo,Datanucleus,Transient,我在所有管理器中都有一个特定的查询方法,该方法必须返回一个暂时的集合,但我希望在执行查询后立即关闭该查询 tx.begin(); Query query=pm.newQuery(...); Collection col=(Collection)query.execute(); pm.makeTransientAll(col,true); query.close(); tx.commit(); 问题:查询关闭后无法访问集合(DN知道标识?),否则会抛出“查询已关闭”错误 解决方案:创建原始收藏的

我在所有管理器中都有一个特定的查询方法,该方法必须返回一个暂时的集合,但我希望在执行查询后立即关闭该查询

tx.begin();
Query query=pm.newQuery(...);
Collection col=(Collection)query.execute();
pm.makeTransientAll(col,true);
query.close();
tx.commit();
问题:查询关闭后无法访问集合(DN知道标识?),否则会抛出“查询已关闭”错误

解决方案:创建原始收藏的副本

Collection col=new ArrayList((Collection)query.execute());
但我想避免。。。即使它是一个本地副本,并且不是一个深度克隆,它仍然为整个元素数组分配所需的空间(因此,在某个点上会有2倍的分配内存),我希望避免这种情况


我错过了什么有没有办法避免创建克隆?

我找到了这种行为的原因:

如果是org.datanucleus.store.rdbms.query的实例,则查询对象返回(集合)。ForwardQueryResult
这扩展了:AbstractRDBMSQueryResult
这扩展了:AbstractQueryResult
这扩展了:AbstractList

因此,我得到一个对象,它是一个列表实现,查询结果绑定到该实现

/** The Result Objects. */
protected List resultObjs = new ArrayList();

/**
 * Method to return the results as an array.
 * @return The array.
 */
public synchronized Object[] toArray()
{
    assertIsOpen();
    advanceToEndOfResultSet();

    return resultObjs.toArray();
}
因此,我无法避免创建一个新数组