[SEAM] EntityHome中的flush引起的異常
无双Rama
2009-11-26
各位大大,我碰到了一个很奇怪的异常,昨天这个功能运行得还是好好的,今天突然出错了。。。难以理解
我在页面中有一个按钮,调用后台的一个更新的方法:<a4j:commandButton value="确认" action="#{a.update}" /> 后台: @Named("a") public class A(){ aService.updateA(object); } @Named("aService") public class AService extends EntityHome<Abc>(){ EntityManager em = this.getEntityManager(); public void updateA(Abc abc){ em.merge(abc); em.flush(); } } 问题出现了,如果去掉红色字体部分,提交表单是没问题的,页面也跟着改变,可是我重新查询或刷新之后,页面又回到以前的效果,就是一切值都复原了,去数据库里面查看,数据跟第一次进页面一样,没有作任何改变 但是如果我加上红色字体部分,就会报这样的错误: javax.persistence.TransactionRequiredException: no transaction is in progress 怎么办呢?? ![]() |
|
CarlKing
2009-11-30
hiberate 會把存取過的entity cache起來(按照java persistence 的規範),而在適當的時機flush。
flush的時機有兩個: 1. transaction結束的時候,在seam裡面也就是該頁面處理完刷新完成後。 2. 若定義了conversation並且使用了manual flush,則要手動使用entitymanager.flush()才會刷新。 因此若是已經完成作業,資料又沒進到DB,請檢查: 1.conversation是否開了忘了關 2.使用entitymanager.flush()請他馬上更新狀態至DB。 |
|
andyhan
2009-12-01
如果设置成Manuel Flush,可以在updateA方法上标注@Transactional注解。
|
|
无双Rama
2009-12-05
问题已经解决了,原因是在一个action中使用了两个实体管理器,后来我改用
@In(value="entityManager") EntityManager entityManager ; 的方式就OK了。。。 |