[SXT][WY]Hibernate02 session

2024-01-25 19:48
文章标签 session wy sxt hibernate02

本文主要是介绍[SXT][WY]Hibernate02 session,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 写一个工具类专门处理session

 

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

 private static SessionFactory factory;
 
 static {
  try {
   Configuration cfg = new Configuration().configure();
   factory = cfg.buildSessionFactory();
  }catch(Exception e) {
   e.printStackTrace();
  }
 }
 
 public static SessionFactory getSessionFactory() {
  return factory;
 }
 
 public static Session getSession() {
  return factory.openSession();
 }
 
 public static void closeSession(Session session) {
  if (session != null) {
   if (session.isOpen()) {
    session.close();
   }
  }
 }
}

2. 用junit来做测试,状态转换基本例子

 

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.Transaction;

import junit.framework.TestCase;

 

public class SessionTest extends TestCase {

 

 public void testSave1() {
  Session session = null;
  Transaction tx = null;
  User user = null;
  try {
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   
   //Transient状态
   user = new User();
   user.setName("李四");
   user.setPassword("123");
   user.setCreateTime(new Date());
   user.setExpireTime(new Date());
   
   //persistent状态。此时user的id属性被赋值,但是user只在缓存没在数据库中。由此将生成insert语句

   session.save(user);

   /* session.save() 方法具体理解:

    1、这个例子走到save时,不会生成insert语句,但是会分配id值。是因为generator为uuid时,由hibernate负责计算id值。等到commit时,才会执行insert语句。

    2、如果 generator为native(既由数据库生成主键值时),走到save时,会生成执行insert语句,由数据库给主键分配值。 但是!此时查数据库并不会看到这条数据(这条数据已经存在),这是跟数据库的隔离级别有关。因为有回滚机制,如果出错,这条被插入的数据还是会被删除。
   */   


   user.setName("王五");// 由此将生成update语句
   //session.update(user);
   tx.commit();
  }catch(Exception e) {
   e.printStackTrace();
   tx.rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
  
  //detached状态
  user.setName("张三");
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
    //persistent状态
   session.update(user);
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }  
 }

}

 

3、get()方法, 只能根据主键加载

 

public void testReadByGetMethod1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   //马上发出查询sql,加载User对象
   User user = (User)session.get(User.class, "402880d01b9bf210011b9bf2a2ff0001");
   System.out.println("user.name=" + user.getName());
   
   //persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步
   user.setName("龙哥");

 

   // 注意 这里再拿一次这个对象时,输出的name是新的数据:‘龙哥’。而数据库中的数据还是老数据(因为到commit时才能写入 数据库)

   // 这说明了 session对于用户可以理解为一个最前方的数据库。get取的对象如果session中存在,就不会去数据库拿

   user = (User)session.get(User.class, "402880d01b9bf210011b9bf2a2ff0001");
   System.out.println("user.name=" + user.getName());

   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }

 

 

public void testReadByGetMethod2() {
  Session session = null;
  try {
   session = HibernateUtils.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 {
   HibernateUtils.closeSession(session);
  }
 }

 

4、load()例子, 只能根据主键加载

 

public void testReadByLoadMethod1() {
  Session session = null;
  try {
   session = HibernateUtils.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 {
   HibernateUtils.closeSession(session);
  }
 }

 

 

public void testReadByLoadMethod2() {
  Session session = null;
  try {
   session = HibernateUtils.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 {
   HibernateUtils.closeSession(session);
  }
 }

 

 

5、 update()例子

 

public void testUpdate1() {
  Session session = null;
  try {
   session = HibernateUtils.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 {
   HibernateUtils.closeSession(session);
  }
 } 

 

 

6、delete()例子

 

public void testDelete1() {
  Session session = null;
  try {
   session = HibernateUtils.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 {
   HibernateUtils.closeSession(session);
  }
  
  //transient状态
 } 

 

 

小结:

 

了解get和load的区别?
 * get不支持lazy,load支持lazy
 * 采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常
 
transient状态的特征?
 * 在数据库中没有与之匹配的数据
 * 没有纳入session的管理
 
persistent状态的特征?
 * persistent状态的对象在数据库中有与之匹配的数据
 * 纳入了session的管理
 * 在清理缓存(脏数据检查)的时候,会和数据库同步
 
detached状态的特征?
 * 在数据库中有与之匹配的数据
 * 没有纳入session的管理    

 

这篇关于[SXT][WY]Hibernate02 session的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/644406

相关文章

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

flask-login 生成 cookie,session

flask-login 生成 cookie,session Flask-Login login_user() 显示来自 Set-Cookie 标头的加密 cookie # 模拟一个用户类class User(UserMixin):def __init__(self, id):self.id = id@app.route('/login')def login():# 模拟用户登录过程user

Session用法详解

本文引用http://www.accdb.net/article.asp?id=1115 阅读本文章之前的准备   阅读本文章前,需要读者对以下知识有所了解。否则,阅读过程中会在相应的内容上遇到不同程度的问题。   懂得ASP/ASP.NET编程    了解ASP/ASP.NET的Session模型    了解ASP.NET Web应用程序模型    了解ASP.N

报错:Reached the max session limit(DM8 达梦数据库)

报错:Reached the max session limit - - DM8 达梦数据库 1 环境介绍2 数据库启动SYSTEM IS READY后面日志3 数据库刚启动日志4 达梦数据库学习使用列表 1 环境介绍 某项目无法连接数据库,报错:超过最大会话数限制 , 检查 dmdba ulimit -a openfiles 已改检查 dm.ini 其中 MAX_SESSION

Requests库对session的支持

场景:如何获取登录时响应消息中的sessionid,以及如何在后续请求中把sessionid添到cookie中 Requests库提供了一个Session类,通过requests库中的session对象,requests库会自动帮我们保存服务端返回的cookie数据(set-cookie里的内容),也会在HTTP发出请求时自动在消息头中放入cookie数据。 用py模拟客户端接收响应消息:

Flask-Session扩展,使用Redis存储会话数据

深入理解Flask-session扩展Redis Flask 应用中使用 flask-session 扩展将 session 数据存储在 Redis 中是一种高效且可扩展的方法,特别是在需要处理大量用户或需要分布式部署的应用中。以下是如何在 Flask 应用中配置 flask-session 以使用 Redis 存储 session 的步骤: 1. 安装必要的库 首先,你需要安装 Flask

浏览器百科:网页存储篇-Session storage应用实例(九)

1.引言 在前面的文章中,我们详细介绍了如何在 Chrome 浏览器中打开并使用 Session storage 窗格,进行数据的查看、编辑和管理。作为网页存储技术的重要组成部分,sessionStorage在提升用户体验和数据管理能力方面发挥了重要作用。在本篇《浏览器百科:网页存储篇-Session storage应用实例(九)》中,我们将深入探讨sessionStorage的实际应用场景,通

springboot 联合redis实现session共享springsession (springMVC的在上一篇) [二〇一八年十一月十四日]]

1创建springboot工程: 这个就不bb了, 不过我只能用main方法跑, 用tomcat跑回报一个redis的getConfig异常, 不管了 2引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>1.

spring 配置spring-session+redis共享 涉及nginx+redis知识 (二〇一八年十一月十二日 )

前提: 单实例的工程下, session是一个非常好用的对象, 因为session属于服务器端, 而且对于用户(浏览器)来说是唯一的 但是针对集群(今天大拿跟我说了下集群和分布式的概念)来说的话, session共享就变得极其重要,因为session是属于服务器端的, 服务器A有session, 但是服务器B拿session是拿不到的 废话不多说, 开始上代码. 总共分三步: 第一步: 首先

关于cookie和session的直观讲解(二)

前言 上一章,讲解了Cookie,本章介绍Session. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中HttpSession。 Session 基础 获取HttpSession对象: HttpSession session = request.getSession(); 使用HttpSession对象: Object getAttribute