2007-12-18

ejb环境下的org.hibernate.TransientObjectException

网站上用户注册的同时还要给用户加分.

以前ear部署时CallByValue设置的是false(ear-deployer.xml), 后来改成了true, 然后就不能加分了, 注册还是可以的, 就是一直报org.hibernate.TransientObjectException的异常.

代码大概是这样的:
Consumer c = new Consumer();
c.setUsername("uname001");
c.setPassword("pwordddd");
service.save(c);//1
service.addPoints(c, 300);//2

service是对EJB的引用(Stateless)
故事就是由EJB引起的.如果CallByValue=false, 在执行"1"后执行
System.out.println(c.getId());//841
返回值不是空, 如果CallByValue=true, 返回值就是空.

分析一下 : CallByValue时, Hibernate不能同步c的id.

POJO有3种状态, Transient, Persistent, Detached, Transient是用"new" 实例化的, 执行hibernate的save操作, 会存储到数据库的同时更新这个对象, 变成Persistent.而在CallByValue=true 的情况下, hibernate无法更新到这个对象, 也就是说, 在上面1步骤执行的时候, hibernate没有办法更新c这个变量.

废话多了, 好像也没大说明白....

No comments: