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基本废掉。