delete方法让处于持久化状态的对象或者处于游离状态的对象转化为删除状态。
public void test() { User user = new User();//刚被 new出来 处于临时状态 user.setName("giao");//设置的是非OID属性,属性并没有OID,依然处于临时状态 user.setId(1L);//属性有了OID,此时 处于 游离状态 Session session = HibernateUtil.getSession(); session.beginTransaction();//设置事务活动状态 /** *情况1.session.delete(user);//删除处于游离状态的属性,属性进入删除状态 * *情况2.先 session.get(user)使得对象处于持久化状态 * 后调用session.delete(user);对象进入了删除状态 */ System.out.println(user.getId());//还存在OID,在事务提交后才会真正的从数据库删除 session.getTransaction().commit();//提交事务 session.close(); } 3.持久化状态特点:对象具有OID值,也在一级缓存中,被session管理
save方法把临时状态转换为持久化状态
save方法把游离对象变成另一个持久化状态,创建一个新的session
get和load方法返回的是持久化对象.
Query.list方法返回的是持久化对象
update方法把游离对象变成持久化对象
4.游离状态(托管状态)特点:有OID,但是不被session管理,不在一级缓存中
closed、clear方法把所有处于持久化状态的对象变成游离状态
处于临时状态的对象设置OID属性后变成游离状态
默认情况下,在事务提交时,会自动去数据库同步这一次对象发送状态变化并且发送sql语句
临时状态变成持久化状态发送INSERT 语句
持久化或者游离状态变成删除状态发送的是DELETE语句
游离状态变成 持久化状态发送INSERT或者UPDATE
在事务环境下,通过get方法得到的对象,只要修改了属性值,会发生UPDATE语句. 在事务提交的时候检查一级缓存中的数据和快照区域是否相同,如果不同(脏数据),把一级缓存中的数据同步到数据库发送的是UPDATE语句
总结:session中的方法改变的是对象的状态与sql的发送没有关系,在事务提交的时候同步数据库的数据(发送SQL语句)