Hibernate三种状态和Session常用的方法

原创 2015年12月20日 00:09:51

       我们知道Hibernate的核心就是对数据库的操作,里面的核心接口就是org.hibernate.Session接口。要想对数据库操作我们就要理清楚对象在整个操作中的所属的状态(Transient,Persistent,Detached)。就像马士兵老师在视频中所说的,我们并不必死抠这些字眼,我们通过自己编写测试类就可以他们之间不同的区别。

       其实三种状态各自的不必总结那么多,只是一个重要的地方就是Transient状态里面的对象是没有id的。

      

      session中常用的方法是save(),update(),saveOrUpdate(),get(),load(),delete(),clear(),flush()这些

      其中大学期间我其实对get和load方法都不是太熟悉,死记硬背才在考试中答题,现在想起完全没有这个必要。我们可以根据配置好的hibernate环境来进行junit测试。

首先我们进行get()方法进行测试。

    这里我们首先建立一个实体类,StudentEntity.java 和数据库中student所对应

package com.cwnu.entities;

import javax.persistence.*;
import java.io.Serializable;

/**
 * Created by yangy on 2015/12/19.
 */
@Table(name = "student")
@Entity
public class StudentEntity implements Serializable{
    private int id;
    private String name;
    
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
       junit类都是idea编译环境给我们配置好了,这里我们要注意,要使用getCurrentSession()来操作的话,我们首先要在Junit类中加上@Transaction注解,下面是相关的测试方法:

    @Test
    public void testGetOrLoad() {
        Session session = sessionFactory.getCurrentSession();
        StudentEntity student = (StudentEntity)session.get(StudentEntity.class, 1);

        //StudentEntity student_load = (StudentEntity)session.load(StudentEntity.class,1);   String name = student.getName();
    }
      先测试get方法,我们发现一旦我们只是拿student这个实体操作,get方法是会输出相关的sql查询语句的,而我们注释掉get方法,换load方法的话,load方法执行拿student这个实体的数据是没有输出相应的sql语句的。但是我们在对student类进行操作的时候,这时才输出相关的语句.

      所以我们看出get()和load()之间的差别:

      get()每次执行都会执行sql语句,不会延迟。load()方法只是会在我们对拿到的实体进行操作的时候才去执行查询,拿到相应的实体信息。load方法返回的是一个代理对象(马士兵老师视频)。无论是get还是load首先都会查一级缓存(session)中有没有相应的对应值,如果没有,再去数据库进行查找。

     

      clear()方法是对session里面的缓存进行了清理,测试这个方法我们可以根据下面的Junit进行测试:

 @Test
    public void testClear() {
        Session session = sessionFactory.getCurrentSession();
        session.get(StudentEntity.class,1);
        session.clear();
        session.get(StudentEntity.class,1);
    }
     如果我们把session.clear()注释掉的话,我们就可以看到只执行了一条sql语句

   

    flush()方法是是对数据库同步的一条语句,执行完这个后立即刷新到数据库。粗浅的来看哈,其实里面还是有很多东西,比如FlushMode这个类,我们默认设置的是FlushMode.AUTO,这个一般不修改,只是为了以后的性能调优。其实我们在执行事务的时候,事务完成之后它会帮我们执行flush()方法。只是我们在进行大规模插入的时候,我们经常可以看到下面的操作:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();   
for ( int i=0; i<100000; i++ ) {    
Customer customer = new Customer(.....);    
session.save(customer);    
if ( i % 20 == 0 ) { 
//20, same as the JDBC batch size        
//flush a batch of inserts and release memory:        
session.flush();   
session.clear();    
}}   
tx.commit();session.close();
      这样做的目的就是避免大量插入,造成session里面内存溢出,所以我们定时清理一下就可以避免这个问题。

   

     

      


Hibernate中Session的操作解释

Hibernate的透明持久化用起来非常舒服,有时甚至忘记了数据库的存在。我身边的朋友经常会分不清save、saveOrUpdate、update的区别,lock、merge、replicate、re...
  • shrek_xu
  • shrek_xu
  • 2006年05月16日 12:49
  • 60899

Hibernate中的Session详解

Session缓存 session缓存是由一系列的Java集合构成的。当一个对象被加入到Session缓存中,这个对象的引用就加入到了java的集合中,以后即使应用程序中的引用变量不再引用该对象...
  • qq_33642117
  • qq_33642117
  • 2016年07月23日 23:33
  • 1618

Hibernate session加载对象的过程

阐述Session加载实体对象的过程。 答:Session加载实体对象的步骤是: ① Session在调用数据库查询功能之前,首先会在一级缓存中通过实体类型和主键进行查找,如果一级缓存查找命中...
  • u014284252
  • u014284252
  • 2015年10月13日 16:48
  • 627

Hibernate(session管理)

  • 2008年05月30日 17:09
  • 685B
  • 下载

hibernate中创建session的两种方式方式,区别在哪里?

hibernate的session的产生方式,区别在哪里? hibernate的session的产生方式,区别在哪里?如何产生? session的产生方式有哪些,并且为什么要分这个...
  • qq_25843323
  • qq_25843323
  • 2015年12月13日 21:27
  • 2600

浅谈hibernate的sessionFactory和session

首先,讲一个悲伤的故事。。。 有一天,一个以为自己javaEE很叼的程序员,在经历了好久不写java代码的情况下,去参加阿里巴巴的java面试,然后,在被问到一个很简单的问题的时候,结果没有回答好。...
  • jiangxindu1
  • jiangxindu1
  • 2015年08月28日 00:10
  • 21820

hibernate session的获取方式

仅为个人理解.请指正 Hibernate Session, 其作用无需多言. 在运用中为避免资源消耗,一般都会手动封装一个HibernateUtil类(未使用Spring管理的前提下). 该类的...
  • loadhai
  • loadhai
  • 2014年01月06日 21:00
  • 3851

hibernate session缓存机制

Hibernate向我们提供的主要的操纵数据库的接口,Session就是其中的一个,它提供了基本的增,删,改,查方法.而且具有一个缓存机制,能够按照某个时间点,按照缓存中的持久化对象属性的变化来更新数...
  • dongnan591172113
  • dongnan591172113
  • 2012年09月04日 20:20
  • 9907

分布式Session的几种实现方式

一。分布式Session的几种实现方式 1.基于数据库的Session共享 2.基于NFS共享文件系统 3.基于memcached 的session,如何保证 memcached 本身的...
  • u014352080
  • u014352080
  • 2016年06月26日 20:38
  • 19254

谈谈分布式Session的几种实现方式,Session和Cookie的区别和联系以及Session的实现原理

一。分布式Session的几种实现方式 1.基于数据库的Session共享 2.基于NFS共享文件系统 3.基于memcached 的session,如何保证 memcached 本身的高可...
  • DreamSeeker_1314
  • DreamSeeker_1314
  • 2016年04月08日 19:42
  • 5296
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate三种状态和Session常用的方法
举报原因:
原因补充:

(最多只允许输入30个字)