把jtable的改变写入数据库

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        entityManager.getTransaction().begin();
        entityManager.clear();
        Cxb c = cxbList.get(jTable1.getSelectedRow());
        entityManager.merge(c);
        entityManager.getTransaction().commit();       
        jTable1.repaint();
    } 

eclipselink jpa2.0 是有L2缓存的。说是可以禁用掉,但是无论怎样都禁不掉。因为我做了这样的实验:

由于jtable和jList是绑定的,所以在jtable做的修改,回车后就进了jList。然后

cxbList.clear();

cxbList.addAll(cxbQuery.getResultList());

得到的也是修改后的数据,但是

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        cxbList.clear();
        entityManager.clear();
        entityManager.getEntityManagerFactory().getCache().evictAll();
        cxbList.addAll(cxbQuery.getResultList());
        jTable1.repaint();
    } 
之后还是修改前的数据。由此可见缓存没有被禁用。当然也许L2缓存被禁了,L1的缓存没被禁。但transaction-type="RESOURCE_LOCAL"又规定了操作必须在会话中进行。L1也不可能被禁用。所以我基本不可能在table上修改,一回车就进了数据库。除非我调用键盘响应代替按钮,其实也一个意思。总之L2是否禁用都绕不开,那就用entityMagager老实处理吧。-----------2.14-------------又研究了几天发现tablemodel只有在会话中的那几个有改变的方法才会响应。前面的那些操作也许最后是卡在了tablemodel上。总之这么修改是对的。但不是我之前猜测的是缓存响应了merge,而是tablemodel响应了merge。谁知道呢,也许都响应了吧。ide封装了很多东西,一开始入手难免有点迷糊。相信最后会明白。

现在我终于知道entityMagager为啥要先clear,因为建立的时候,里面都被cxb实体塞满了。不清空就有重复。只是这样的代码真不优雅,refresh和flush基本废掉。


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值