1

我有一个返回实体列表的查询。当我尝试将此列表放入缓存时,我得到了熟悉的java.lang.IllegalArgumentException.

但是...我可以毫无问题地将列表中的每个项目都放入缓存中。即使我创建一个新LinkedList的,使用 for 循环将实体从获取的列表复制到这个新的并尝试将其放入缓存中,它也可以工作。

List<MyEntity> a = (List<MyEntity>) q.execute(getKey());

List<MyEntity> b = new LinkedList<MyEntity>();
for (MyEntity e : a)
        b.add(e);

cache.put(key, b); // this works
cache.put(key, a); // this doesn't

那么我错过了什么?缓存其他查询有效,我不知道为什么这个不同。

4

1 回答 1

2

JDO 查询返回的最有可能List是不可序列化的,因为它是一个动态代理。

要制作副本,您可以简单地使用

List<MyEntity> b = new ArrayList<MyEntity>(a);

注意:这会a从 的元素中创建一个新列表b,但不会创建元素的副本,因此它非常轻量级。

于 2012-08-17T14:38:22.783 回答