XFire 复杂类型配置问题

chenhang_83 2008-09-24 04:59:12
我有两个javabean.互相关联(对应的数据库表有关联Main和details是一对多的关系)
比如说: Main.java
public class Main implements java.io.Serializable {
private String mpomainid;
private String mpocode;
private Set<Details> details= new HashSet<Details>(0);
... /** get and set */
}

Details.java
public class Details implements java.io.Serializable {
private String id;
private String code;
private Main main;
... /** get and set */
}
我在查询main这个表的时候.客户端显示main加details的结果.但老是会报java.lang.StackOverflowError的错.
如果我在main下面配置了main的aegis.xml的吧.并把ignore的属性设置为true.就不报错了.但details的信息就不会出来,请问这种问题应该怎么解决.我是jdk1.5+Spring+hibernate,
小弟分不多.只能散50分了.在线等啊.急!!!!!
...全文
367 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qihangcom 2010-07-21
  • 打赏
  • 举报
回复
sddsdsds
SlpingKing 2008-09-27
  • 打赏
  • 举报
回复
谢谢 xinhaoluan 的回答,受益匪浅。
chenhang_83 2008-09-27
  • 打赏
  • 举报
回复
谢谢各位的帮助.
我用的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服务和客户在一台机器上测试的
xinhaoluan 2008-09-26
  • 打赏
  • 举报
回复
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中规定的数据类型。
C0150 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chenhang_83 的回复:]
补充一下:
我在查询主表的时候.是根据id去查询,用的是hibernater的load();
会和这个关系吗?
[/Quote]

这个没有关系的,你也可以根据你的实际情况,自己在hibernate中写各种查询方法的。
C0150 2008-09-26
  • 打赏
  • 举报
回复
看看是不是你detail的hbm.xml文件有问题,检查一下关联的属性语法之类的,如:
<many-to-one name="employPlan" column="employ_plan_id"
class="org.ejs.hr.model.EmployPlan" cascade="none">
</many-to-one>
参考一下吧,应该不是什么大问题的。
SlpingKing 2008-09-26
  • 打赏
  • 举报
回复
同时天涯沦落人!我也有类似的问题困扰着呢!我的返回值 List 类型的,可是在 XFire 生成的类里调用,打印出来的,却不是数据库的数据。不知道你是否知道怎么解决。请赐教!不过对于不能帮助你,非常的抱歉!
chenhang_83 2008-09-25
  • 打赏
  • 举报
回复
怎么没人回一下?
chenhang_83 2008-09-24
  • 打赏
  • 举报
回复
补充一下:
我在查询主表的时候.是根据id去查询,用的是hibernater的load();
会和这个关系吗?

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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