我有一个返回实体列表的查询。当我尝试将此列表放入缓存时,我得到了熟悉的 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
那么我缺少什么?缓存其他查询有效,我不知道为什么这个不同。
最佳答案
很可能 JDO 查询返回的 List
不可序列化,因为它是动态代理。
要制作副本,您只需使用
List<MyEntity> b = new ArrayList<MyEntity>(a);
注意:这会根据 b
的元素创建一个新列表 a
,但不会复制元素,因此它非常轻量级。
关于java - GAE、JDO、Jcache : can't put a list of entities to the cache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007466/