[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了。。。
Global site tag (gtag.js) - Google Analytics