把jtable的改变写入数据库

来源:互联网 发布:霸业降级修为数据 编辑:程序博客网 时间:2024/06/05 03:36
    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基本废掉。


原创粉丝点击