`

hibernate学习笔记第8讲-session_flush-数据库隔离级别

阅读更多

 

Session  flush:

默认在commit之前执行flush

Session  flush方法主要做了两件事

           1清理缓存

           2 执行sql

Session flush 在什么时候执行:

           1 默认在事务提交commit

           2, 显示调用。

     3 在执行查询前,如 iterate

hibernate按照save(insert),updatedelete顺序提交相关操作

 

 

数据库隔离级别:


 

大部分数据库采用 read commited

Mysql 默认采用repeatable read

脏读:事务还没提交,就可以读到,此时如果事务回滚,就出现脏数据。

不可重复读:第一次读的为A,之后另一个人修改为B,此时再读,显示为B,与第一次读的不同,出现不可重复读。解决办法:在第一次读的时候锁住该条记录,别人修改不了。

幻读:第一次查询读出5条数据,之后别人添加记录,当第二次读的时候,变成10条记录。此时为幻读。

 

 

/**

 * 测试uuid主键生成策略

 */

tx = session.beginTransaction();

                    User1 user = new User1();

                    user.setName("李四");

                    user.setPassword("123");

                    user.setCreateTime(new Date());

                    user.setExpireTime(new Date());

                   

//因为user的主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理

//不会发出insert语句,但是id已经生成,sessionexistsInDatebase状态为false

                    session.save(user);

                   

                    //调用flushhibernate会清理缓存,执行sql

//如果数据库的隔离级别设置为为提交读,那么我们可以看到flush过的数据

                    //并且sessionexistsInDatebase状态为true

                    session.flush();

                   

                    //提交事务

//默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush

                    //commit后数据是无法回滚的

                    tx.commit();

 

 

/**

 * 测试native主键生成策略

 */

 

tx = session.beginTransaction();

 

                    User2 user = new User2();

 

                    user.setPassword("123");

                    user.setCreateTime(new Date());

                    user.setExpireTime(new Date());

                   

                    //因为user的主键生成策略为native,依赖于数据库的主键生成策略,只有执行了sql,数据库才会生成id,所以调用session.save后,将执行insert语句,返回有数据库生成的id

                    //纳入了session的管理,修改了sessionexistsInDatebase状态为true

                    //如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据

                    session.save(user);

                    tx.commit();

 

/**

 * 测试uuid主键生成策略, evict()

 */

 

tx = session.beginTransaction();

                    User1 user = new User1();

                    user.setName("王五");

                    user.setPassword("123");

                    user.setCreateTime(new Date());

                    user.setExpireTime(new Date());

                   

                     //因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理

//不会发出insert语句,但是id已经生成,sessionexistsInDatebase状态为false

                    session.save(user);

                   

                    //user对象从session中逐出,即sessionEntityEntries属性中逐出

                    session.evict(user);

                  

                    //无法成功提交,因为hibernate在清理缓存时,在sessioninsertions集合中取出user对象进行insert操作后需要更新entityEntries属性中的existsInDatabasetrue,而我们采用evict已经将usersessionentityEntries中逐出了,所以找不到相关数据,无法更新,抛出异常

                    tx.commit();

 

 

/**

 * 测试uuid主键生成策略,解决evict()

 */

 

tx = session.beginTransaction();

                    User1 user = new User1();

                    user.setName("王五");

                    user.setPassword("123");

                    user.setCreateTime(new Date());

                    user.setExpireTime(new Date());

                   

                    //因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理,不会发出insert语句,但是id已经生成,sessionexistsInDatebase状态为false

                    session.save(user);

                   

                    //flushhibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象清除,并且设置sessionexistsInDatebase的状态为true

                    session.flush();

                   

                    //user对象从session中逐出,即sessionEntityEntries属性中逐出

                    session.evict(user);

                   

                    //可以成功提交,因为hibernate在清理缓存时,在sessioninsertions集合中无法找到user对象,所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态

                    tx.commit();

/**

 * 测试native主键生成策略,evict()

 */

 

tx = session.beginTransaction();

                    User2 user = new User2();

                    user.setName("张三11");

                    user.setPassword("123");

                    user.setCreateTime(new Date());

                    user.setExpireTime(new Date());

                   

                    //因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id

                    //纳入了session的管理,修改了sessionexistsInDatebase状态为true

                    //如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据

                    session.save(user);

                   

                    //user对象从session中逐出,即sessionEntityEntries属性中逐出

                    session.evict(user);

                   

                    //可以成功提交,因为hibernate在清理缓存时,在sessioninsertions集合中无法找到user对象

                    //所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态

                    tx.commit();

 

/**

 * 测试assigned主键生成策略,执行sql顺序

 *

 */

 

tx = session.beginTransaction();

                    User3 user = new User3();

                    user.setId("001");

                    user.setName("张三");

                   

                    session.save(user);

                   

                    user.setName("王五");

                   session.update(user);

                   

                    User3 user3 = new User3();

                    user3.setId("002");

                    user3.setName("李四");

                    session.save(user3);

                   

                    //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

                    //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

                    //Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?

                    //hibernate按照save(insert),updatedelete顺序提交相关操作

                    tx.commit();

 

/**

 * 测试assigned主键生成策略,执行sql顺序

 *

 */

 

tx = session.beginTransaction();

                    User3 user = new User3();

                    user.setId("003");

                    user.setName("张三");

                   

                    session.save(user);

                   

                    user.setName("王五");

                    session.update(user);

                   

                    session.flush();

                   

                    User3 user3 = new User3();

                    user3.setId("004");

                    user3.setName("李四");

                    session.save(user3);

                   

                    //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

                    //Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?

                    //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

                    //因为我们在session.udpate(user)后执行了flush,所以在清理缓存时执行flush前的sql不会生成

                    //sql会按照我们的意愿执行

                    tx.commit();

  • 大小: 19.3 KB
分享到:
评论

相关推荐

    hibernate-note学习笔记

    ### hibernate-note学习笔记知识点详解 #### 一、对象持久化 **1.1 概述** 对象持久化是指将程序中的对象状态保存到非易失性存储中(如硬盘或磁盘等),以便在系统重启后仍能保留这些状态。这种技术常用于将对象的...

    hibernate 学习笔记3

    标题:Hibernate学习笔记3 描述:本篇笔记深入探讨了Hibernate框架中一对多关系的映射及持久化对象状态管理,结合个人理解与实践经验,旨在为读者提供一份详实的学习资料。 ### 一、一对多关系映射详解 在...

    Hibernate学习笔记(培训学习时的笔记)

    【Hibernate学习笔记】 Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库与Java应用程序之间的交互。本笔记将深入探讨Hibernate的核心概念、配置、实体管理、查询语言以及事务处理等方面,帮助...

    hibernate学习笔记

    **hibernate学习笔记概述** Hibernate 是一个强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。这篇学习笔记将深入探讨Hibernate的核心概念、主要功能和...

    Hibernate教程_note.pdf

    本教程中提及的Hibernate学习笔记详细介绍了Hibernate框架的使用方法。首先,文档介绍了Hibernate的基本概念和映射框架的结构,随后通过一个示例来具体说明如何操作。核心部分包括了Hibernate中的一些主要接口和持久...

Global site tag (gtag.js) - Google Analytics