关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Java Hibernate 之 Session 状态

    Java Hibernate 之 Session 状态

    2015-04-18 00:00:00 出处:developerworks - 周明耀
    分享

    Session接口是Hibernate向程序提供操纵数据库的最主要接口,是单线程对象,它提供了基本的保存、更新、删除和查询方法。它有一个缓存,保存了持久化对象,当清理缓存时,按照这些持久化对象同步更新数据库。

    注意:session的某些方法(persist,load)不会立即把改动写入数据库,而是缓存到session的一级缓存中,除非显示调用flush,或者关闭session时才会更新到数据库

    临时状态(Transient):没与session关联 持久化状态(Persistent):与session关联,没close 游离状态(Detached):当session.close后

    Session的方法详解

    1.保存

    save:立即插入数据库,并且返回主键

    persist:不立即(延迟)插入数据库,无返回值

    2.获取

    load:加载对象后,对对象的改动不会立即刷新到db,必须flush到db

    ex: User user=session.load(User.class,2);

    user.setName(‘gt’);

    user.flush(); (延迟加载)

    get:加载对象后,对对象的改动立即刷新到db

    3.更新

    update:持久化对象,更新

    saveOrUpdate:包含save()和update()功能,如果传入的参数是临时对象(没有保存过)就调用save()方法;如果传入的参数是游离对象,就调用update()方法

    merge:不会持久化对象,只会把托管对象的修改更新到db

    4.删除

    delete:从数据库中删除与JAVA对象对应的记录

    5.清理

    flush:把缓存同步到db

    clear:清除session的缓存大小(更新批量时,应考虑)

    三种状态的转换关系

    java框架篇---hibernate之session状态

    下面通过实例讲解:

    实体:

    package cn.itcast.h_session_method;
    
    public class User {
        private Integer id;
        private String name;
        private byte[] data = new byte[1024 * 1024 * 5];
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }

    映射文件:

    < xml version="1.0" >
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="cn.itcast.h_session_method">
    
        <!-- 
            lazy属性:默认为true,默认可以懒加载。
         -->
        <class name="User" table="user" lazy="true">
            <id name="id">
                <generator class="native"></generator>
            </id>
            <property name="name"/>
        </class>
    
    </hibernate-mapping>

    配置文件:hibernate.cfg.xml

    < xml version='1.0' encoding='utf-8' >
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
    
    <session-factory>
    
        <!--数据库连接设置 -->
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="connection.url">
            jdbc:mysql://localhost:3306/mytest
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
    
        <!-- 方言 -->
        <property name="dialect">
            org.hibernate.dialect.MySQL5Dialect
        </property>
    
        <!-- 控制台显示SQL -->
        <property name="show_sql">true</property>
    
        <!-- 自动更新表结构 -->
        <property name="hbm2ddl.auto">update</property>
        <mapping resource="cn/itcast/h_session_method/User.hbm.xml" />
    
    </session-factory>
    
    </hibernate-configuration>

    测试文件

    package cn.itcast.h_session_method;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    import com.java1234.util.HibernateSessionFactory;
    
    public class App {
    
        private static SessionFactory sessionFactory = HibernateSessionFactory.getSessionFactory();
    
        // save():把临时状态变为持久化状态(交给Sessioin管理)
        // 会生成:insert into ...
        @Test
        public void testSave() throws Exception {
            Session session = sessionFactory.openSession();
            session.beginTransaction();
            // --------------------------------------------
    
            User user = new User(); // 临时状态
            user.setName("test");
            session.save(user); // 变为了持久化状态
    
            // --------------------------------------------
            session.getTransaction().commit();
            session.close();
    
            user.setName("李四"); // 游离状态
            System.out.println(user.getName()); // 游离状态
        }
    
        // update():把游离状态变为持久化状态
        // 会生成:update ...
        // 在更新时,对象不存在就报错
        @Test
        public void testUpdate() throws Exception {
            Session session = sessionFactory.openSession();
            session.beginTransaction();
            // --------------------------------------------
    
            User user = (User) session.get(User.class, 1);
            System.out.println(user.getName()); // 持久化状态
    
            // session.clear(); // 清除Session中所有的对象
            session.evict(user); // 清除Session中一个指定的对象
    
            user.setName("newname3");
            session.update(user);
            System.out.println("----");
            // session.flush(); // 刷出到数据库
    
            // --------------------------------------------
            session.getTransaction().commit(); // 
            session.close();
        }
    
        // saveOrUpdate():把临时或游离状态转为持久化状态
        // 会生成:insert into 或 update ...
        // 在更新时,对象不存在就报错
        // 本方法是根据id判断对象是什么状态的:如果id为原始值(对象的是null,原始类型数字是0)就是临时状态,如果不是原始值就是游离状态。
        @Test
        public void testSaveOrUpdate() throws Exception {
            Session session = sessionFactory.openSession();
            session.beginTransaction();
            // --------------------------------------------
    
            User user = new User();
            user.setId(3); // 自己生成一个游离状态对象
            user.setName("newName");
    
            session.saveOrUpdate(user);
    
            // --------------------------------------------
            session.getTransaction().commit();
            session.close();
        }
    
        // delete():把持久化或游离转为删除状态
        // 会生成:delete ...
        // 如果删除的对象不存在,就会抛异常
        @Test
        public void testDelete() throws Exception {
            Session session = sessionFactory.openSession();
            session.beginTransaction();
            // --------------------------------------------
    
            // User user = (User) session.get(User.class, 2); // 持久化
    
            User user = new User();
            user.setId(300);
    
            session.delete(user);
            session.flush();
    
            System.out.println("---");
    
            // --------------------------------------------
            session.getTransaction().commit();
            session.close();
        }
    
        // get():获取数据,是持久化状态
        // 会生成:select ... where id= 
        // 会马上执行sql语句
        // 如果数据不存在,就返回null
        @Test
        public void testGet() throws Exception {
            Session session = sessionFactory.openSession();
            session.beginTransaction();
            // --------------------------------------------
    
            User user = (User) session.get(User.class, 5); // 持久化
            System.out.println(user.getClass());
            // System.out.println("---");
            // System.out.println(user.getName());
    
            // --------------------------------------------
            session.getTransaction().commit();
            session.close();
        }
    
        // load():获取数据,是持久化状态
        // 会生成:select ... where id= 
        // load()后返回的是一个代理对象,要求类不能是final的,否则不能生成子类代理,就不能使用懒加载功能了。
        // 让懒加载失效的方式:一、把实体写成final的;二、在hbm.xml中写<class ... lazy="false">
        // 不会马上执行sql语句,而是在第1次使用非id或class属性时执行sql。
        // 如果数据不存在,就抛异常:ObjectNotFoundException
        @Test
        public void testLoad() throws Exception {
            Session session = sessionFactory.openSession();
            session.beginTransaction();
            // --------------------------------------------
    
            User user = (User) session.load(User.class, 5);
            System.out.println(user.getClass());
            System.out.println("---");
            System.out.println(user.getId());
            System.out.println(user.getName());
            // System.out.println(user.getName());
    
            // --------------------------------------------
            session.getTransaction().commit();
            session.close();
        }
    
        // 操作大量数据,要防止Session中对象过多而内存溢出
        @Test
        public void testBatchSave() throws Exception {
            Session session = sessionFactory.openSession();
            session.beginTransaction();
            // --------------------------------------------
    
            for (int i = 0; i < 30; i++) {
                User user = new User();
                user.setName("测试");
                session.save(user);
    
                if (i % 10 == 0) {
                    session.flush(); // 先刷出
                    session.clear(); // 再清空
                }
            }
    
            // --------------------------------------------
            session.getTransaction().commit();
            session.close();
        }
    
        @Test
        public void test2() throws Exception {
            Session session = sessionFactory.openSession();
            session.beginTransaction();
            // --------------------------------------------
    
            User user = (User) session.get(User.class, 5); // 持久化
            System.out.println(user.getName());
    
            // session.clear();
            // user = (User) session.get(User.class, 5); // 持久化
    
            session.refresh(user); // 刷新Session缓存中对象的状态,即重新select一下
            System.out.println(user.getName());
    
            // --------------------------------------------
            session.getTransaction().commit();
            session.close();
        }
    }

    对于刚创建的一个对象,如果session中和数据库中都不存在该对象,那么该对象就是临时对象(Transient)

    临时对象调用save方法,或者游离对象调用update方法可以使该对象变成持久化对象,如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比较,如果不同,则发送一条update语句,否则就不会发送语句

    游离对象就是,数据库存在该对象,但是该对象又没有被session所托管

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    DESTOON标签(tag)调用手册说明(最新版)

    Destoon 9.0全站伪静态规则设置清单(Apache版)

    Destoon 9.0全站伪静态规则设置清单(Nginx版)

    Destoon 8.0全站伪静态规则设置清单(Apache版)

    Destoon 8.0全站伪静态规则设置清单(Nginx版)

    Destoon会员公司地址伪静态com/目录如何修改?两步轻松搞定,适合Nginx和Apache

    Python 并行处理列表的常见方法及其优缺点分析

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    IT头条

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    技术热点

    最常用的 Eclipse 快捷键整理

    多表多查询条件对SQL Server查询性能的优化

    浅谈如何优化SQL Server服务器

    HTTP 协议中使用 Referer Meta 标签控制 referer

    好用的mysql备份工具

    Android开发中的MVP架构详解

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。