execute是列出ext_money中的所有数据
insert是插入或者保存数据当单单执行(重启完tomcat不执行insert方法)execute的时候没有任何问题,数据不会出现改动但如果执行了一条修改操作,则再执行execute列出的数据就会出现不稳定状态,而这个不稳定就是修改的这条数据总会在原值与修改值之间改变,但数据库的值已经被改变我的数据库是mysql打印的相关日志:修改操作
{"money":1211,"id":"2"}
Hibernate: update test.ext_money set type=?, money=? where id=?连续再次刷新出现的不同值
Hibernate: select extmoney0_.id as id1_, extmoney0_.type as type1_, extmoney0_.money as money1_ from test.ext_money extmoney0_
[{"id":"1","money":91,"type":"支出"},{"id":"2","money":1211,"type":"收入"},{"id":"3","money":121,"type":"收入"},{"id":"4","money":113,"type":"支出"},{"id":"402880f92f5e3534012f5e357da20001","money":101,"type":"支出"},{"id":"402880f92f5e412f012f5e419b610001","money":12,"type":"收入"}]
Hibernate: select extmoney0_.id as id1_, extmoney0_.type as type1_, extmoney0_.money as money1_ from test.ext_money extmoney0_
[{"id":"1","money":91,"type":"支出"},{"id":"2","money":121,"type":"收入"},{"id":"3","money":121,"type":"收入"},{"id":"4","money":113,"type":"支出"},{"id":"402880f92f5e3534012f5e357da20001","money":101,"type":"支出"},{"id":"402880f92f5e412f012f5e419b610001","money":12,"type":"收入"}]public class Ch18 {
public void execute(HttpServletRequest request, HttpServletResponse response) throws TransformerException, IOException{
ExtMoneyDAO emd = new ExtMoneyDAO();
List list = emd.findAll();
JSONArray json = new JSONArray();
json.addAll(list);
System.out.println(json.toString());
String xml = new XMLSerializer().write(json);
//如何在jsp里面得到相对路径
InputStream is = request.getSession().getServletContext().getResourceAsStream("/extserver/array.xslt");
Source xmlSource = new StreamSource(new ByteArrayInputStream(xml.getBytes("utf-8")));//文件一定要用utf-8来读取
Source xsltSource = new StreamSource(is,"utf-8");//转的地方是包裹inputstream的地方,而不是inputstream
TransformerFactory transFact = TransformerFactory.newInstance();
Transformer trans = transFact.newTransformer(xsltSource);
trans.transform(xmlSource, new StreamResult(response.getWriter()));
}
public void insert(HttpServletRequest request, HttpServletResponse response) throws Exception{
ExtMoneyDAO emd = new ExtMoneyDAO();
String content = Nehnre.decode(request.getParameter("content"));
System.out.println(content);
JSONArray arr = JSONArray.fromObject(content);
System.out.println(arr.toString());
JSONObject json = null;
ExtMoney em = null;
ExtMoney orEm = null;
for(int i=0;i<arr.size();i++){
json = arr.getJSONObject(i);
System.out.println(json.toString());
em = (ExtMoney)JSONObject.toBean(json, ExtMoney.class);
if(em.getId() != null && !"".equals(em.getId())){
orEm = emd.findById(em.getId());
if(em.getMoney() != null){
orEm.setMoney(em.getMoney());
}
if(em.getType() != null){
orEm.setType(em.getType());
}
} else {
orEm = em;
}
Transaction tx = emd.getSession().beginTransaction();
emd.save(orEm);
emd.getSession().flush();
tx.commit();
}
emd.getSession().close();
}
}

解决方案 »

  1.   

    建议在每次调用execute方法后,调用clear方法清空缓存。
    另外,楼主所说的修改方法是不是insert?
      

  2.   

    LZ好好看看Hibernate的缓存吧!!!
      

  3.   


    出现脏读了楼主执行完insert后你得更新缓存呀,楼主得好好研究下缓存
    session.flush();
      

  4.   

    如果一条记录修改后,再查询这条记录就会出现不稳定状态,一会显示修改前的数据,一会显示修改后的数据。真是不好意思,我对hibernate的缓存机制还没好好看过呢
      

  5.   


    我insert完后已经flush过了
      

  6.   

    http://blog.csdn.net/summer_0571/archive/2009/09/13/4547946.aspx
    这个可以看一看
      

  7.   

    有个问题,查询时还需要事务控制么?按你给文章的说法,session.flush()只会在以下三种情况下执行,如果查询不需要事务难免会出现第二次去数据的脏读?*session在什么情况下执行flush
         默认在事务提交时(commit)
         显示的调用flush
         在执行查询前,如:iterate