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

作者:寻找现实扭曲力场 时间:2021-11-28 15:04:43 

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

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

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

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里面内存溢出,所以我们定时清理一下就可以避免这个问题。

来源:http://blog.csdn.net/pearyangyang/article/details/50359382

标签:hibernate,session
0
投稿

猜你喜欢

  • Java实战之在线寄查快递系统的实现

    2023-08-10 21:52:23
  • C# 数组删除元素的实现示例

    2022-03-02 08:55:04
  • Spring实战之协调作用域不同步的Bean操作示例

    2023-01-23 02:48:10
  • JAVA设置手动提交事务,回滚事务,提交事务的操作

    2022-07-20 08:07:40
  • 利用Lambda表达式创建新线程案例

    2023-08-26 23:16:00
  • JavaWeb使用Session和Cookie实现登录认证

    2023-12-11 19:13:29
  • C#支付宝扫码支付代码完整版

    2021-07-19 18:48:08
  • Android使用CountDownTimer模拟短信验证倒计时

    2022-10-24 18:00:28
  • Java 并发编程之线程挂起、恢复与终止

    2022-02-18 11:51:51
  • Java SpringBoot的相关知识点详解

    2023-11-23 02:36:35
  • 解决@CachePut设置的key值无法与@CacheValue的值匹配问题

    2021-09-10 13:28:49
  • 老生常谈Scanner的基本用法

    2021-08-27 00:34:18
  • Java基于ShardingSphere实现分库分表的实例详解

    2022-04-20 18:43:37
  • java的io操作(将字符串写入到txt文件中)

    2022-05-28 22:59:23
  • C#中使用IFormattable实现自定义格式化字符串输出示例

    2023-05-31 23:34:04
  • RecyclerView实现纵向和横向滚动

    2023-04-03 14:50:44
  • Android模拟用户点击的实现方法

    2022-05-09 09:02:31
  • 带大家认识Java语法之泛型与通配符

    2021-06-04 06:14:46
  • Scala方法与函数使用和定义详解

    2021-10-05 06:34:12
  • C++ 风靡一时的连连看游戏的实现流程详解

    2022-10-08 13:39:12
  • asp之家 软件编程 m.aspxhome.com