Google App Engine平台下JDOQL查询报异常的问题解决方案
2011-09-20 20:11
543 查看
在java应用程序开发中使用JDO数据存储的方式,里面涉及到以对象为基础建立永久性数据。看不到数据库文件也看不到表,只有自定义的实体类,存储的方式也很简单,定义一个实体类,然后将其属性赋值,然后调用PersistenceManager 类提供的方法存储这个对象即可。但是在数据的查询过程中却是伤透脑筋。以下是我近几天遇到的问题和自己琢磨的解决方案,其中Baby是我定义的实体类。
1.执行GetObjectById()抛出异常” Could not retrieve entity of kind Baby with key Baby("31~60")”其中Baby是我定义的实体类,30~61是我传递的一个作为Id的参数。一直以为哪里的代码出现问题了或者参数的格式不对等问题,经反复试验才知道。这就是GetObjectById()这个方法本身的问题。不像SQL中传入个Id查询有则返回这个对象,没有则返回空,JDO中的数据查询是传入的Id必须能查到数据,若没有就抛出上述异常。
解决方案:将GetObjectById()方法用try/catch括起来,形如:
try
{
Baby baby=PM.GetObjectById(“30~61”);
return baby;
}
Catch(Exception e)
{
return null;
}
这样,有这个数据返回该记录没有则返回null
2.执行newQuery()抛出类型转换错误
具体英文我忘了,意思就是说意思就是说无法将Baby集合转换成Baby类型,也就是List<Baby>无法转换成Baby类型。在SQL中可能根据一条查询语句”select * from Baby where Id=’31~60’”调用方法返回的可以转换成Baby对象,可是JDO中调用newQuery()不管传入的查询语句参数是什么,都会返回一个List<Object>类型。
解决方案:调用newQuery()就将其结果赋值一个List<Object>的变量吧。
3. 执行newQuery()方法抛出” Object Manager has been closed”的异常
这是位于DataServer类中的查询方法代码:
public static List<Baby> GetBabyInfoList(String queryString)
{
PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = pm.newQuery(queryString);
@SuppressWarnings("unchecked")
List<Baby> babys = (List<Baby>) query.execute();
pm.close();
return babys;
}
我在另一处调用
String queryStr=”select from Baby”;
List<Baby> babies=DataServer.GetBabyInfoList(queryStr);
结果一运行就抛那个异常了。原因就是GetBabyInfoList方法中的pm.close();,将这句去掉就OK了,了解JDO的人士可能会说将实体类定义成可分离的再在代码中加句pm.setDetachAllOnCommit(true);。事实无情的告诉你,不行!
解决方案:去掉方法中在返回对象前的pm.close();语句。
1.执行GetObjectById()抛出异常” Could not retrieve entity of kind Baby with key Baby("31~60")”其中Baby是我定义的实体类,30~61是我传递的一个作为Id的参数。一直以为哪里的代码出现问题了或者参数的格式不对等问题,经反复试验才知道。这就是GetObjectById()这个方法本身的问题。不像SQL中传入个Id查询有则返回这个对象,没有则返回空,JDO中的数据查询是传入的Id必须能查到数据,若没有就抛出上述异常。
解决方案:将GetObjectById()方法用try/catch括起来,形如:
try
{
Baby baby=PM.GetObjectById(“30~61”);
return baby;
}
Catch(Exception e)
{
return null;
}
这样,有这个数据返回该记录没有则返回null
2.执行newQuery()抛出类型转换错误
具体英文我忘了,意思就是说意思就是说无法将Baby集合转换成Baby类型,也就是List<Baby>无法转换成Baby类型。在SQL中可能根据一条查询语句”select * from Baby where Id=’31~60’”调用方法返回的可以转换成Baby对象,可是JDO中调用newQuery()不管传入的查询语句参数是什么,都会返回一个List<Object>类型。
解决方案:调用newQuery()就将其结果赋值一个List<Object>的变量吧。
3. 执行newQuery()方法抛出” Object Manager has been closed”的异常
这是位于DataServer类中的查询方法代码:
public static List<Baby> GetBabyInfoList(String queryString)
{
PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = pm.newQuery(queryString);
@SuppressWarnings("unchecked")
List<Baby> babys = (List<Baby>) query.execute();
pm.close();
return babys;
}
我在另一处调用
String queryStr=”select from Baby”;
List<Baby> babies=DataServer.GetBabyInfoList(queryStr);
结果一运行就抛那个异常了。原因就是GetBabyInfoList方法中的pm.close();,将这句去掉就OK了,了解JDO的人士可能会说将实体类定义成可分离的再在代码中加句pm.setDetachAllOnCommit(true);。事实无情的告诉你,不行!
解决方案:去掉方法中在返回对象前的pm.close();语句。
相关文章推荐
- Google App Engine平台下JDOQL查询报异常的问题解决方案
- Google App Engine平台下JDOQL查询报异常的问题解决方案 推荐
- [GoogleAppEngine]GAE平台需设置默认threadsafe-编译问题
- 解决Google App Engine的中文乱码问题
- Google App Engine Launcher无法启动问题解决
- Google App Engine错误解决方案之Class com.xxx.xxx does not seem to have been enhanced. You may want to rerun the enhancer and check for
- Google Appengine 使用JSTL的问题
- google app engine java 包问题
- Google发布App Engine 欲打造网络应用统一平台
- 初遇 Google App Engine, 更新问题的解决
- google app engine的缓存服务解决性能问题
- 初遇 Google App Engine, 更新问题的解决
- Google云计算开发平台 google appengine体会谈
- Google App Engine Jsp的jdk问题[转载]
- 部署struts2项目到 google app engine (age)中遇到的一个问题
- Google App Engine开发问题之javax.servlet.FilterChain is a restricted class
- 麻雀虽小,五脏俱全:上手Google App Engine遇到的问题总结
- Google云计算开发平台 google appengine体会谈
- Google appengine中文乱码问题 和图片显示问题
- eclipse下安装pydev,google app engine 插件无法显示设置的问题