一个典型的 CMR 问题,请高手们看看

sanyo_rider 2004-11-14 03:06:57
1、两个实体BEAN CYDMDB DHBDDXGDB,关系是一对多。
/////////////////////////////////////////////////////////////
2、在sessionbean中调用函数:getResult() 代码如下:
Context ctx = new InitialContext();
Object objRef = ctx.lookup("Cydmdb");
home = (CydmdbHome) javax.rmi.PortableRemoteObject.narrow(objRef,
CydmdbHome.class);

testbean=home.findByPrimaryKey("Y700");//find
c=testbean.getDhbDdxgdb();
//返回一个collection,这个collection里有多个dhbddxgdb对象
return c;//本函数返回。
/////////////////////////////////////////////////////////////
3、在servlet里边的调用如下:
Context ctx = new InitialContext();
Object objRef = ctx.lookup("getcmp7");
home = (getcmp7Home) javax.rmi.PortableRemoteObject.narrow(objRef, getcmp7Home.class);
getcmp7=home.create(); //create local

Collection c=rybm.getResult();//////////////////问题就出在这里
out.println(c.size());
/////////////////////////////////////////////////////////////
4、错误提示:
A CMR collection may only be used within the transction in which it was created
/////////////////////////////////////////////////////////////
5、为什么出现这样的错误,应该如何解决?
谢谢大家
...全文
229 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
luancunlin 2004-11-15
  • 打赏
  • 举报
回复
up
SInoyew 2004-11-15
  • 打赏
  • 举报
回复
UP
hezhen1981 2004-11-15
  • 打赏
  • 举报
回复
这个问题我遇到过。涉及cmr的操作不能在servlet里写,只能写在sessionBean里,就像上面的老兄说的那样。即:
Collection c=rybm.getResult()
只能在sessionBean里写
zhukejun 2004-11-15
  • 打赏
  • 举报
回复
A CMR collection may only be used within the transction in which it was created

应该很明白了,CMR collection使用范围不对
fashchina 2004-11-15
  • 打赏
  • 举报
回复
up
Carlson Wang 2004-11-15
  • 打赏
  • 举报
回复
不能直接把把collection返回,把数据取取出后在包装后返回给servlet
这个问题和cmr没关系
sanyo_rider 2004-11-15
  • 打赏
  • 举报
回复
我也抵制日货
sanyo_rider 2004-11-15
  • 打赏
  • 举报
回复
怎么没有朋友回答我的问题啊?顶一下也可以啊
是问题太难了吗?
dongdonghe1 2004-11-15
  • 打赏
  • 举报
回复
我抵制日货
jiafcat 2004-11-15
  • 打赏
  • 举报
回复
由于你使用了CMP,EJB容器就自动帮你管理事务(transaction)了。你的SessionBean的方法getResult()中就自动使用的事务。事务在getResult()中开始,又在getResult()返回时commit了。根据你的错误提示可以理解为:Collection c=rybm.getResult()的c必须在事务环境中才能使用,所以一旦getResult()返回后,collection对象就不能使用了。
Servlet和SessionBean属于两个不同的层(layer),在两个不同层之间传递数据,常见的方式是使用:DTO(data transfer object)模式。也就是pbMaster的方法,复制一个collection返回。
DTO是J2EE中很常见的一种方法,你可以参考一下相关书籍。
pbMaster 2004-11-15
  • 打赏
  • 举报
回复
这个问题我也碰到过,不过提示就不是这样的了。
我记得提示是:按照EJB规范,CMR的结果集不用直接被远程使用。
我当时的解决办法是复制一个Collection,把这个复制的结果返回。
就是说:
c=testbean.getDhbDdxgdb();
需要再new 一个collection,把c中的内容复制给d,再把d返回。
sanyo_rider 2004-11-14
  • 打赏
  • 举报
回复
怎么会这样呢?

67,550

社区成员

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

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