- 浏览: 158610 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (210)
- java (44)
- javascript (5)
- 网摘 (21)
- 程序人生 (19)
- hibernate (21)
- spring (7)
- struts (1)
- jquery (2)
- mssql (3)
- mysql (3)
- oracle (7)
- 学习日记 (10)
- PowerDesigner (1)
- android (4)
- 调试 (1)
- tomcat (3)
- webapp (1)
- context (2)
- jsp (2)
- 学习 (18)
- 态度 (4)
- 坚持 (4)
- jsf (1)
- ui (1)
- css (1)
- seam (0)
- 转载 (5)
- JNDI (1)
- 创业 (1)
- 公司 (1)
- 方向 (1)
- ETL (1)
- Datastage (1)
- 数据整合 (1)
- 心情,感触 (1)
- 开发 (2)
- 测试 (1)
- 需求 (1)
- 湿身 (1)
- 网购,分类 (1)
- 驾校,转载 (1)
- 中秋,露营 (1)
- 域名 (1)
- 空间 (1)
- 网站程序 (1)
- SolrCloud (1)
- Solr (6)
- 全文库 (1)
- HBase (1)
- Hadoop (1)
- 网络应用 (1)
- 数据结构 (1)
- NoSQL (1)
- jQueryEasyUI (1)
- 面试 (1)
- 三十六计 (1)
- S2S3H4 (1)
- jar (1)
- war (1)
- web 项目 (1)
- Subversion (1)
- TortoiseSVN (1)
- MyEclipse (1)
- eclipse svn插件 (1)
- SQL2005 (1)
- ASP (1)
- 笔记 (2)
- 虚拟器、centOS、jdk、tomcat、nginx (1)
- memcached (1)
- nginx (1)
- telnet (1)
- nfs (1)
- zookeeper (2)
- window (1)
- linux (3)
- cronolog (1)
- web (1)
- mybatis (3)
- 设计模式 (1)
- 测试覆盖率 (1)
- EclEmma (1)
- tomcat7 (1)
- sore (1)
- 时间 (1)
- fackbook (0)
- facebook (1)
- IK (2)
- PKUSUMSU (1)
- openoffice (1)
- pdf (1)
- memcache (1)
- 动态词库 (1)
- 动态同义词 (1)
- centos7.3 (2)
- maven (4)
- 111 (0)
- nexus (2)
- 23种设计模式 (1)
- springboot (1)
- shiro (1)
- redis (1)
- rabbitMQ (1)
- native (1)
- dll (1)
- jasperReports (1)
- ireport (1)
最新评论
-
zhongfenglin:
学车的经历 -
Tiny_小小:
...
网购的选择 -
jrjr200411:
楼主写的好!
面对大公司和小公司的选择 -
feelboy:
说的很好。
每周四十小时,你有多少是在为自己干活?
了解Hibernate中CRUD操作
了解get和load的区别?
* get不支持lazy,load支持lazy
* 采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常
transient状态的特征?
* 在数据库中没有与之匹配的数据
* 没有纳入session的管理
persistent状态的特征?
* persistent状态的对象在数据库中有与之匹配的数据
* 纳入了session的管理
* 在清理缓存(脏数据检查)的时候,会和数据库同步
detached状态的特征?
* 在数据库中有与之匹配的数据
* 没有纳入session的管理
----------------------------------------------------------------------------------------
session flush测试:
session flush方法主要做了两件事:
* 清理缓存
* 执行sql
session在什么情况下执行flush
* 默认在事务提交时
* 显示的调用flush
* 在执行查询前,如:iterate
hibernate按照save(insert),update、delete顺序提交相关操作
public void testSave1() { Session session = null; Transaction tx = null; User user = null; try { session = HibernateSessionFactory.getSession(); tx = session.beginTransaction(); //Transient状态 user = new User(); user.setName("李四"); user.setPassword("123"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); //persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步 session.save(user); user.setName("王五"); session.update(user); tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateSessionFactory.closeSession(session); } //detached状态 user.setName("张三"); try { session = HibernateSessionFactory.getSession(); session.beginTransaction(); //persistent状态 session.update(user); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateSessionFactory.closeSession(session); } } public void testReadByGetMethod1() { Session session = null; try { session = HibernateSessionFactory.getSession(); session.beginTransaction(); //马上发出查询sql,加载User对象 User user = (User)session.get(User.class, "402880d01b9bf210011b9bf2a2ff0001"); System.out.println("user.name=" + user.getName()); //persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步 user.setName("龙哥"); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateSessionFactory.closeSession(session); } } public void testReadByGetMethod2() { Session session = null; try { session = HibernateSessionFactory.getSession(); session.beginTransaction(); //采用get加载数据,如果数据库中不存在相应的数据,返回null User user = (User)session.get(User.class, "asdfsafsdfdsf"); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateSessionFactory.closeSession(session); } } public void testReadByLoadMethod1() { Session session = null; try { session = HibernateSessionFactory.getSession(); session.beginTransaction(); //不会发出查询sql,因为load方法实现了lazy(懒加载或延迟加载) //延迟加载:只有真正使用这个对象的时候,才加载(发出sql语句) //hibernate延迟加载实现原理是代理方式 User user = (User)session.load(User.class, "402880d01b9bf210011b9bf2a2ff0001"); System.out.println("user.name=" + user.getName()); //persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步 user.setName("发哥"); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateSessionFactory.closeSession(session); } } public void testReadByLoadMethod2() { Session session = null; try { session = HibernateSessionFactory.getSession(); session.beginTransaction(); //采用load加载数据,如果数据库中没有相应的数据 //那么抛出ObjectNotFoundException User user = (User)session.load(User.class, "55555555"); System.out.println(user.getName()); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); throw new java.lang.RuntimeException(); }finally { HibernateSessionFactory.closeSession(session); } } public void testUpdate1() { Session session = null; try { session = HibernateSessionFactory.getSession(); session.beginTransaction(); //手动构造的detached状态的对象 User user = new User(); user.setId("402880d01b9be8dc011b9be9b23d0001"); user.setName("德华"); session.update(user); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateSessionFactory.closeSession(session); } } public void testDelete1() { Session session = null; try { session = HibernateSessionFactory.getSession(); session.beginTransaction(); // //手动构造的detached状态的对象 // User user = new User(); // user.setId("402880d01b9be8dc011b9be9b23d0001"); // user.setName("德华"); // session.delete(user); User user = (User)session.load(User.class, "402880d01b9be8dc011b9be9b23d0001"); session.delete(user); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateSessionFactory.closeSession(session); } //transient状态 }
/** * 测试uuid主键生成策略 */ public void testSave1() { Session session = null; Transaction tx = null; try { session = HibernateSessionFactory.getSession(); 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已经生成,session中existsInDatebase状态为false session.save(user); //调用flush,hibernate会清理缓存,执行sql //如果数据库的隔离级别设置为为提交读,那么我们可以看到flush过的数据 //并且session中existsInDatebase状态为true session.flush(); //提交事务 //默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush //commit后数据是无法回滚的 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateSessionFactory.closeSession(session); } } /** * 测试native主键生成策略 */ public void testSave2() { Session session = null; Transaction tx = null; try { session = HibernateSessionFactory.getSession(); tx = session.beginTransaction(); User2 user = new User2(); user.setName("张三1"); user.setPassword("123"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); //因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id //纳入了session的管理,修改了session中existsInDatebase状态为true //如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据 session.save(user); tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateSessionFactory.closeSession(session); } } /** * 测试uuid主键生成策略 */ public void testSave3() { Session session = null; Transaction tx = null; try { session = HibernateSessionFactory.getSession(); 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已经生成,session中existsInDatebase状态为false session.save(user); //将user对象从session中逐出,即session的EntityEntries属性中逐出 session.evict(user); //无法成功提交,因为hibernate在清理缓存时,在session的insertions集合中取出user对象进行insert操作后 //需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session的entityEntries //中逐出了,所以找不到相关数据,无法更新,抛出异常 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateSessionFactory.closeSession(session); } } /** * 测试uuid主键生成策略 */ public void testSave4() { Session session = null; Transaction tx = null; try { session = HibernateSessionFactory.getSession(); 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已经生成,session中existsInDatebase状态为false session.save(user); //flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象 //清除,并且设置session中existsInDatebase的状态为true session.flush(); //将user对象从session中逐出,即session的EntityEntries属性中逐出 session.evict(user); //可以成功提交,因为hibernate在清理缓存时,在session的insertions集合中无法找到user对象 //所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateSessionFactory.closeSession(session); } } /** * 测试native主键生成策略 */ public void testSave5() { Session session = null; Transaction tx = null; try { session = HibernateSessionFactory.getSession(); 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的管理,修改了session中existsInDatebase状态为true //如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据 session.save(user); //将user对象从session中逐出,即session的EntityEntries属性中逐出 session.evict(user); //可以成功提交,因为hibernate在清理缓存时,在session的insertions集合中无法找到user对象 //所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateSessionFactory.closeSession(session); } } /** * 测试assigned主键生成策略 * */ public void testSave6() { Session session = null; Transaction tx = null; try { session = HibernateSessionFactory.getSession(); 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),update、delete顺序提交相关操作 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateSessionFactory.closeSession(session); } } /** * 测试assigned主键生成策略 * */ public void testSave7() { Session session = null; Transaction tx = null; try { session = HibernateSessionFactory.getSession(); 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(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateSessionFactory.closeSession(session); } }
发表评论
-
Hibernate工作原理
2019-05-14 20:00 395hibernate 简介:hibernate是一个开源框架, ... -
SSH整合的几种最常见方式 .
2012-03-22 12:00 1237Spring实例Action的两种方式:1、Delegatin ... -
Hibernate Annotation笔记
2011-11-23 23:58 647(1)简介:在过去几年里,Hibernate不断发展,几乎 ... -
使用 Hibernate 进行大数据量的性能测试
2010-11-08 20:28 1011近日为是否在项目中使 ... -
加速你的Hibernate引擎
2010-11-08 19:35 729参考(上、下): http://blog.csdn.net/ ... -
hibernate各种属性配置
2010-10-29 10:32 1028hibernate.dialect 一个Hibern ... -
hibernate的映射
2010-10-24 17:41 731集合映射 public class CollectionMa ... -
多对多
2010-10-24 17:11 722多对多单向 User(多)对多(Role),一般都是通过中间 ... -
多对一
2010-10-24 17:00 851多对一单向 User(多)对Group(一),在User实体 ... -
一对多
2010-10-24 16:51 745一对多单向 定义两个实体类,及两个映射文件 一对多一的一端 ... -
一对一
2010-10-24 16:36 688一对一单向 定义两个类,两个映射文件一个工具类生成表 pu ... -
hibernate的抓取策略
2010-10-24 16:08 747hibernate抓取策略(单端代理的批量抓取) 保持默认, ... -
hibernate的继承
2010-10-24 15:54 697每棵继承树映射成一张表 1、理解如何映射 因为类继承树肯定 ... -
hibernate的锁
2010-10-24 15:48 779乐观锁 大多数基于数据版本记录机制(version)实现,一 ... -
hibernate的lazy
2010-10-24 15:44 813hibernate lazy策略可以使用在: * <cl ... -
hibernate的缓存
2010-10-24 15:33 1004hibernate一级缓存 一级缓存很短和session的生命 ... -
hibernate查询语言hql
2010-10-24 13:46 1126在hql中关键字不区分大 ... -
hibernate基本配置
2010-10-24 13:22 8201.开发环境Window 2.开发工具MyEclispe5. ... -
Hibernate 各种数据库的配置
2010-09-13 10:33 9451. MySql连接配置 MySql数据库的hiber ... -
hibernate学习
2009-07-21 13:54 931hibernate多对多的解决Hibernate多对多的例子 ...
相关推荐
集中式Session管理方案是解决多应用、多服务器之间Session共享问题的一种有效方法,尤其在分布式系统和集群环境中显得尤为重要。这种方案旨在确保用户在不同应用系统之间切换时,其Session信息能够保持一致,提供...
【标题】:“Tomcat-Redis-Session管理”的实践指南 在Web应用开发中,Session管理是关键的一环,用于在用户浏览器与服务器之间保持状态。传统的Session存储方式是将数据存放在服务器内存中,但随着高并发访问和...
在iOS、macOS或其他使用Swift开发的平台上,Session管理对于处理网络请求、保持用户登录状态、管理应用程序状态至关重要。下面将详细介绍这个项目中的关键知识点。 1. **Swift编程语言**: Swift 是苹果公司推出的...
【跨服务Session管理详解】 在Web服务开发中,Session管理是一项关键任务,特别是在涉及多个相关服务的复杂系统中。跨服务Session管理允许不同Web服务之间共享用户的状态信息,确保在整个应用流程中用户的一致性...
标题中的“tomcat8专用session管理包.rar”指的是一个针对Tomcat 8的特定session管理解决方案,这个压缩包包含了在使用Nginx作为反向代理服务器,并与Redis结合实现负载均衡场景下,确保Tomcat应用间session数据共享...
在IT行业中,Session管理是Web应用中的重要环节,它用于维护用户登录状态,确保用户在不同请求间的数据一致性。在大型分布式系统中,由于多台服务器之间无法共享内存,传统的Session管理方式不再适用。这时,我们...
SpringSession 是一个强大的框架,它扩展了 Spring Framework 的 Session 支持,允许开发者在分布式环境中管理用户会话。尤其在处理多台 Tomcat 服务器时,SpringSession 提供了一种优雅的方式来实现 session 共享,...
集中式Session管理方案是一种在分布式环境中解决多个应用服务器之间共享用户会话状态的技术。这种方案主要解决了在多台服务器上部署的应用系统如何协同处理用户的Session数据,确保用户在不同服务器间的无缝切换,...
在Spring框架中,Session管理是实现用户会话跟踪的关键部分,尤其在分布式系统中,传统的HttpSession面临跨服务器共享的问题。SpringSession的引入解决了这个问题,它提供了一种在多个应用服务器之间共享Session数据...
【Spring Session】是一种创新的解决方案,旨在应对现代云环境下的Session管理挑战。随着微服务架构和高度可扩展的原生云应用的普及,传统的Java EE Session管理方式已无法满足需求。Spring Session API 提供了一种...
"Go-Packagesession为Macaron提供session管理"这个主题意味着我们将深入探讨如何在Macaron框架中使用session管理来维持用户会话。 session在Web开发中扮演着重要的角色,它允许服务器存储关于用户状态的信息,即使...
本文将深入探讨Hibernate中的核心概念——Session管理。 首先,理解Session在Hibernate中的角色至关重要。Session是Hibernate的主要工作单元,它是应用程序与数据库之间的桥梁。它负责保存、检索和更新Java对象,...
在这个“JavaScript密码保护和Session管理”的主题中,我们将深入探讨如何利用JavaScript实现用户登录的安全性和会话管理的有效性。 首先,密码保护是任何在线应用的基础。在`demo1.html`、`admin.html`等网页中,...
总结,ThreadLocal是Java中处理线程局部数据的利器,特别适用于需要线程隔离的场景,如Web应用中的session管理。通过合理使用ThreadLocal,可以提升程序的并发性能并保证数据安全性。但同时,需要注意内存管理和避免...
### Android用户Session管理的设计方案 #### 一、引言 在Android应用开发中,用户Session管理是一项基础且重要的功能。合理的Session管理方案不仅能提升用户体验,还能有效保障数据安全。本文档将详细介绍一种基于...
sna集中式session管理实现服务器集群及客户端程序,以“单点登陆、session共享解决方案(2)”为基础建立的服务器机群应用,运行server.bat启动服务器端,将client包导入web工程,通过Client.sessionPut()等方法调用。...
总结,Go-Gosession是Go语言中用于Web session管理的一个强大工具,它提供了高性能、兼容性和灵活性,使得开发者能够轻松地在不同的Web框架下实现用户会话管理。正确理解和使用session管理对于构建健壮的Web应用至关...
### 基于ZooKeeper的分布式Session实现详解 #### 1. 认识ZooKeeper ZooKeeper,形象地被称为“动物园管理...通过利用ZooKeeper的特性,可以有效地克服分布式环境下Session管理的挑战,提高系统的整体性能和用户体验。
该指南详细介绍了TongWeb V7.0 的配置过程,涵盖了Session管理、RedisSession架构模式、TongWeb-MQ使用说明、普通证书、国密证书、加密传输密钥管理、健康检测等方面的知识点。 Session管理是TongWeb V7.0 中的一...