Hibernate三种状态和Session常用的方法
Hibernate三种状态和Session常用的方法
我们知道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;
- }
- }
- @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()和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);
- }
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();
相关推荐
- hibernate三种状态以及session方法
- 登录案例的jsp和controller带有cookie和session的书写方法(实现记住我,管理权限,状态保留的功能)??
- 实现登录状态保持的两种方法 cookie、session和token
- hibernate对象的三种状态,一级缓存和快照
- hibernate对象的三种状态以及加载策略 .附加一级缓存讲解 和 并发控制
- hibernate之管理对象的三种状态及一级缓存和快照(面试题)及加载策略和并发控制
- hibernate 一级缓存(Session缓存)和持久化对象的四种状态
- Hibernate三种状态和Session常用的方法
- Hibernate对象的生命周期(临时状态,持久化状态,游离状态,删除状态)和 缓存(session)
- 线程的状态和常用方法
- 彻底理解softmax
- SpringMVC详谈