Web Service中数据库查询问题,急等!!

fyjin99 2009-12-29 11:57:12
有两个表
CREATE TABLE `country` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`home` int(11) DEFAULT NULL,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `home` (`home`),
CONSTRAINT `user_ibfk_2` FOREIGN KEY (`home`) REFERENCES `country` (`id`) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
这两个表完极其简单,说白了就是user表中有一个home外键指向country表的主键。user表和country表各有一个name属性。
user表和country表是多对一的关系。
建立一个简单的UseService进行User和Country的查询操作。
public class UserService implements IUserService
{
private IUserDAO userDAO;
private ICountryDAO countryDAO;
public User findUserById(Integer id)
{
return userDAO.findById(id);
}
public Country findCountryById(Integer id)
{
return countryDAO.findById(id);
}
.....省略get(), set()
}
数据库采用Hibernate,通过Spring来配置。
建立一个简单测试程序,直接测试
public static void main(String[] args)
{
ApplicationContext ctx = new FileSystemXmlApplicationContext("WebRoot/WEB-INF/applicationContext.xml");
IUserService userService = (IUserService) ctx.getBean("userServiceImpl");
User u= userService.findUserById(5);
System.out.println(u.getName());
Country c=userService.findCountryById(1);
System.out.println(c.getName());
}
测试没问题,可以通过。
使用xFile+Spring配置Web Service服务,没问题,可以查看到相应的wsdl。
现在问题来了:
通过Web Service调用findCountryById(Integer id)时能正确执行,并得到数据。
通过Web Service调用findUserById(Integer id)时出现如下错误:
- <soap:Body>
- <soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Fault: java.lang.NullPointerException</faultstring>
</soap:Fault>
</soap:Body>

在测试程序中User u= userService.findUserById(5);输出sql语句如下:
Hibernate: select user0_.id as id0_0_, user0_.home as home0_0_, user0_.name as name0_0_ from smservice.user user0_ where user0_.id=?
Hibernate: select country0_.id as id1_0_, country0_.name as name1_0_ from smservice.country country0_ where country0_.id=?

通过Web Service调用findUserById(5)时输出sql语句如下:
Hibernate: select user0_.id as id0_0_, user0_.home as home0_0_, user0_.name as name0_0_ from smservice.user user0_ where user0_.id=?
不知道为什么会发生这个错误!!
经过我的多次试验,只要是表中有外键,那么查询时就会出现这个Fault: java.lang.NullPointerException错误!!
恳请各位高人解答!!拜谢!!!!!!
...全文
497 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
fyjin99 2010-01-07
  • 打赏
  • 举报
回复
谢谢各位!尤其感谢(梦里楚香)!!真的是太感谢了!
问题已经解决了,是cglib包的问题,我换成最新的cglib包就可以了!
liuqiboluoxuejuan 2010-01-06
  • 打赏
  • 举报
回复
关注
teacherm 2010-01-06
  • 打赏
  • 举报
回复
关注
奔_腾 2010-01-06
  • 打赏
  • 举报
回复
复杂类型,要写专门的映射
teacherm 2010-01-06
  • 打赏
  • 举报
回复
关注
bayougeng 2010-01-06
  • 打赏
  • 举报
回复
你那边可以debug,在表达式里一个变量一个变量的查,肯定能查到谁是null的。
如果getHibernateTemplate()不是null,那就可能是getHibernateTemplate().get("com.soochow.ecompex.dao.User", id)为null了。
我还是坚持我的观点,既然lazy="false"能解决问题,很可能就是session关闭的原因引起的。
fyjin99 2010-01-06
  • 打赏
  • 举报
回复
帮忙找找原因啊:)
bayougeng 2010-01-06
  • 打赏
  • 举报
回复
。。。
你不会e.printStackTrace(System.err) ?
fyjin99 2010-01-06
  • 打赏
  • 举报
回复
异常就是nullpoint
catch (RuntimeException re)
{
log.error("get failed", re);
System.out.println(re);
System.out.println(re.getMessage());
System.out.println(re.getLocalizedMessage());
System.out.println(re.getCause());
throw re;
}
//这里是执行findUserById(5) 在控制台输出的sql语句
Hibernate: select user0_.id as id0_0_, user0_.home as home0_0_, user0_.name as name0_0_ from smservice.user user0_ where user0_.id=?
//这一句就是打印出的异常信息System.out.println(re);
java.lang.NullPointerException
// System.out.println(re.getMessage());输出结果为空
null
//System.out.println(re.getLocalizedMessage());输出结果为空
null
//System.out.println(re.getCause());输出结果为空
null

下面是我不通过Web Services而直接调用findUserById(5) 在控制台输出的sql语句
Hibernate: select user0_.id as id0_0_, user0_.home as home0_0_, user0_.name as name0_0_ from smservice.user user0_ where user0_.id=?
能得到正确结果!
bayougeng 2010-01-06
  • 打赏
  • 举报
回复
你不一直说是nullPoint么?怎么又不是这个异常了?
把异常贴出来看看。
fyjin99 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 bayougeng 的回复:]
你那边可以debug,在表达式里一个变量一个变量的查,肯定能查到谁是null的。
如果getHibernateTemplate()不是null,那就可能是getHibernateTemplate().get("com.soochow.ecompex.dao.User", id)为null了。
我还是坚持我的观点,既然lazy="false"能解决问题,很可能就是session关闭的原因引起的。
[/Quote]
getHibernateTemplate().get("com.soochow.ecompex.dao.User", id)
是这一句抛出异常!而不是返回空!
session我已经在spring中配置了session的管理,整个ws中函数的执行是在一个session中完成的,也不会是关闭引起的(我可以在ws函数中得到一个类,并通过Hibernate.initialize加载其集合类,如果session关闭就会报session关闭错误,所以这里session根本就没有关闭!)。
还有关键的一点就是:我不通过Web Service调用这些函数是没有问题的!
xiaotian521 2010-01-05
  • 打赏
  • 举报
回复
ding 顶
bayougeng 2010-01-05
  • 打赏
  • 举报
回复
我糊涂了。
你把ws代码和mapping文件贴上来。
还有用ws的时候,报错的是哪行代码。
fyjin99 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bayougeng 的回复:]
你既然用Web Service就肯定有客户端和服务器端的概念。
客户端访问服务器端的Service,得到一个Object。你认为在客户端对这个Object操作的时候,还会报hibernate延迟加载的错误么?客户端甚至不知道这个Object是从数据库检索得到的。当然更无从知道你在用hibernate访问数据库。那又何谈延迟加载呢?
你可以再试试,设置lazy="true",然后在得到Object后,先get它的某个属性,再把这个Object返回。这样应该也不会报错。因为仅仅取得这个Object似乎不能让它加载。真正的加载应该是在取得它的某个属性的时候。
[/Quote]
lazy="true",根本就不能得到这个Object!就是在查询取得Object的时候出错的!
fyjin99 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bayougeng 的回复:]
你既然用Web Service就肯定有客户端和服务器端的概念。
客户端访问服务器端的Service,得到一个Object。你认为在客户端对这个Object操作的时候,还会报hibernate延迟加载的错误么?客户端甚至不知道这个Object是从数据库检索得到的。当然更无从知道你在用hibernate访问数据库。那又何谈延迟加载呢?
你可以再试试,设置lazy="true",然后在得到Object后,先get它的某个属性,再把这个Object返回。这样应该也不会报错。因为仅仅取得这个Object似乎不能让它加载。真正的加载应该是在取得它的某个属性的时候。
[/Quote]
对集合的延迟加载Web Service是会报延迟加载错误的。
这里我说它不是延迟加载错误是因为程序执行到findUserById(5)之后便报这个错误了!根本不能得到查询的结果。这时候数据根本还没有打包返回给Web Service的客户端!
根据debug,其实这个错误是Hibernate本身报出来的,也就是Hibernate执行这一个查询的时候就报了这一个错误,根本就没有对象返回来!应该也谈不上延迟加载!
bayougeng 2010-01-05
  • 打赏
  • 举报
回复
你既然用Web Service就肯定有客户端和服务器端的概念。
客户端访问服务器端的Service,得到一个Object。你认为在客户端对这个Object操作的时候,还会报hibernate延迟加载的错误么?客户端甚至不知道这个Object是从数据库检索得到的。当然更无从知道你在用hibernate访问数据库。那又何谈延迟加载呢?
你可以再试试,设置lazy="true",然后在得到Object后,先get它的某个属性,再把这个Object返回。这样应该也不会报错。因为仅仅取得这个Object似乎不能让它加载。真正的加载应该是在取得它的某个属性的时候。
fyjin99 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 bayougeng 的回复:]
getHibernateTemplate()
这个东西是null么?
[/Quote]
不是空,实际上User instance = (User) getHibernateTemplate().get(
"com.soochow.ecompex.dao.User", id); 这条语句在Web Services调用的时候已经输出了sql语句!
但是在执行输出的第一条sql语句后报出java.lang.NullPointerException异常!
并且应该不是session的问题,我已经在spring中对ws中的服务进行了session的管理(其有效性已经经过验证),所以在整个函数执行过程中应该不会有session的关闭问题。
bayougeng 2010-01-05
  • 打赏
  • 举报
回复
getHibernateTemplate()
这个东西是null么?
fyjin99 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 bayougeng 的回复:]
如果hibernate延迟加载的那个异常是RuntimeException的子类,这一切不就说的通了么?
因为服务器端抛了异常,所以返回给客户端是是null,所以客户端得到的是NullPoint。我觉得这个解释应该算是合情合理吧。
{
log.error("get failed", re);
e.printStackTrace(System.out);
throw re;
}
打出来看看,光说也没用。
另外,你说在find方法的时候就已经报错了,是不是在那个时候session已经关闭了呢?
[/Quote]
是在服务器端抛出了异常,这里异常就是java.lang.NullPointerException!
关键是我不通过Web Services访问而直接调用就不抛出异常。
bayougeng 2010-01-05
  • 打赏
  • 举报
回复
如果hibernate延迟加载的那个异常是RuntimeException的子类,这一切不就说的通了么?
因为服务器端抛了异常,所以返回给客户端是是null,所以客户端得到的是NullPoint。我觉得这个解释应该算是合情合理吧。
{
log.error("get failed", re);
e.printStackTrace(System.out);
throw re;
}
打出来看看,光说也没用。
另外,你说在find方法的时候就已经报错了,是不是在那个时候session已经关闭了呢?
加载更多回复(15)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧