zoukankan      html  css  js  c++  java
  • save,flush,evict

    java代码:

    1. 但是与commit同时使用,会抛出异常   
    2.             session = HibernateUtils.getSession();   
    3.             tx = session.beginTransaction();   
    4.        
    5.             User1 user = new User1();   
    6.             user.setName("李四");   
    7.             user.setPassword("123");   
    8.             user.setCreateTime(new Date());   
    9.             user.setExpireTime(new Date());   
    10.                
    11.             //利用Hibernate将实体类对象保存到数据库中   
    12.             //因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理   
    13.             //不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false   
    14.             session.save(user);   
    15.                    
    16.             session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象   
    17.         //无法成功提交,因为hibernate在清理缓存时,在session的临时集合(insertions)中取出user对象进行insert操作后需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session中逐出了,所以找不到相关数据,无法更新,抛出异常。   
    18.                
    19.             tx.commit();   
    20.   
    21. 解决在逐出session缓存中的对象不抛出异常的方法:   
    22. 在session.evict()之前进行显示的调用session.flush()方法就可以了。   
    23.         //利用Hibernate将实体类对象保存到数据库中   
    24.             //因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理   
    25.             //不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false   
    26.             session.save(user);   
    27.                    
    28.             //flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象清除,并且会设置session中的existsInDatabase状态为false   
    29.             session.flush();   
    30.                
    31.             session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象   
    32.                
    33.             //可以成功提交,因为hibernate在清理缓存时,在Session的insertions中集合中无法找到user对象所以不会发出insert语句,也不会更新session中existsInDatabase的状态。   
    34.             tx.commit();  
    但是与commit同时使用,会抛出异常
    			session = HibernateUtils.getSession();
    			tx = session.beginTransaction();
    	
    			User1 user = new User1();
    			user.setName("李四");
    			user.setPassword("123");
    			user.setCreateTime(new Date());
    			user.setExpireTime(new Date());
    			
    			//利用Hibernate将实体类对象保存到数据库中
    			//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
    			//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
    			session.save(user);
    				
    			session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象
    		//无法成功提交,因为hibernate在清理缓存时,在session的临时集合(insertions)中取出user对象进行insert操作后需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session中逐出了,所以找不到相关数据,无法更新,抛出异常。
    			
    			tx.commit();
    
    解决在逐出session缓存中的对象不抛出异常的方法:
    在session.evict()之前进行显示的调用session.flush()方法就可以了。
    		//利用Hibernate将实体类对象保存到数据库中
    			//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
    			//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
    			session.save(user);
    				
    			//flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象清除,并且会设置session中的existsInDatabase状态为false
    			session.flush();
    			
    			session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象
    			
    			//可以成功提交,因为hibernate在清理缓存时,在Session的insertions中集合中无法找到user对象所以不会发出insert语句,也不会更新session中existsInDatabase的状态。
    			tx.commit();
  • 相关阅读:
    Progressbar
    winform c# 打包
    WinForm中给DataGridView添加 自动编号
    ASP.NET页面的CheckBoxList组件
    C#截取DOS命令输出流取得网卡MAC地址
    get; set ; 害的我搞了一天
    WinForm(C#) 引用app.config文件中的数据库
    WinForm编程中 Enter自动登录设置
    vs新建解决方案,添加新项目,为什么不在解决方案中显示
    使用delegate实现两窗体传参代码
  • 原文地址:https://www.cnblogs.com/xiaoyu1997/p/6379152.html
Copyright © 2011-2022 走看看