补充一下:
我在查询主表的时候.是根据id去查询,用的是hibernater的load();
会和这个关系吗?

解决方案 »

  1.   

    同时天涯沦落人!我也有类似的问题困扰着呢!我的返回值 List 类型的,可是在 XFire 生成的类里调用,打印出来的,却不是数据库的数据。不知道你是否知道怎么解决。请赐教!不过对于不能帮助你,非常的抱歉!
      

  2.   

    看看是不是你detail的hbm.xml文件有问题,检查一下关联的属性语法之类的,如:
    <many-to-one name="employPlan" column="employ_plan_id"
    class="org.ejs.hr.model.EmployPlan" cascade="none">
    </many-to-one>
    参考一下吧,应该不是什么大问题的。
      

  3.   


    这个没有关系的,你也可以根据你的实际情况,自己在hibernate中写各种查询方法的。
      

  4.   

    StackOverflowError应该是堆栈溢出错误,你的程序是否出现过死循环或递归次数过多,按你的程序来说我有一个猜想,是不是你的关联查询的记录过多?我在用Hibernate的时候对于表之间的关联没有用过ignore的这个属性,只用过many-to-one和one-to-many中的lazy属性,按照你的意思把one-to-many的lazy属性设置为false也可以达到预期的效果,不过这样是非常不可取的办法,如果对应的details表的记录过多的话非常影响性能,而且不清楚会不会出现什么奇怪的异常。
    至于你说用hibernater的load()这个方法,在我的记忆中,使用这个方法不会有问题,不过如果hibernate和spring整合,我推荐你用getHibernateTemplate().get()这个方法,在我用load()这个方法的时候没取到数据,至于因为什么早就忘了。
    还有的是关于写webservice的返回复杂类型的问题:首先想想写webservice的作用是什么?顾名思义它是一个网络服务,webservice不仅仅是属于Java这一种语言所有的,打比方说你用Java写了一个webservice并发布,想用你这个webservice的人不一定会知道你用Java写的,人家可以用.net调用,还可以用其它的语言。List和Map等数据类型是Java特有的,非Java语言不一定会有这种数据类型,同时也不认得这种数据类型。所以你写的webservice返回List是没有意义的。如果你真想返回List,XFire相应方法我不知道,我知道用axis2中的AXIOM这个方式写可以做得到,不过写起来也挺麻烦。我个人建议3楼的哥们用数组,比如Person表的数据,返回个Person[]就可以啦,但前提下是Person的属性不要有Java特有的类型。想了解webservice中所允许的数据类型你可以去看下XML Schema中规定的数据类型。
      

  5.   

    谢谢各位的帮助.
    我用的jpa批注的方法.没有写hbm.xml.把lazy设成flase.也有同样的问题,我现在怀疑是查询到主表以后.然后加载明细,加载明细的时候又因为明细的javabean里定义了一个主表main的属性,所以又回到了主表.这样就形成了死循环,我现在有一个解决方案是可以满足的,在配置main.aegis.xml文件时,写了detail的返回类型,但不igonre,然后又写了一个detail.aegis.xml,写上mian返回时igonre为true.这样.问题是解决,但是我觉得这样性能很不好.在查找主表的list时.会关联就去查询明细,这就像楼上提到那个问题.如果detail表的记录很多,性能就会有很大的问题.而且如果以后直接到查detail时.返回的对象里就只有detail.而main为空.
    我现在是测试数据,主表.明细表分别只有一条记录,所以不存在记录过多导致的.
    还有一个webservice的问题.就是速度很慢.我调用webservice时.查询一条记录需要7秒左右,看看控制台,感觉好像是在连接webservice里那块费的时间很多,这个机器的配置有关系吗?webservice服务和客户在一台机器上测试的
      

  6.   

    谢谢 xinhaoluan 的回答,受益匪浅。