Hibernate提供了几种常见的方法,如何使用,之间有什么差异,本章进行探讨,有问题欢迎大家指出;如果大家对Hihernate基本三种状态不了解对可以参考另一篇博客https://mp.csdn.net/postedit/85334737
准备工作:创建一个Test类,主要代码在test中进行编写;
package com.study.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class HibernateTest {
Session session = null;
Transaction transaction = null;
SessionFactory sessionFactory = null;
@Before
public void init() {
// 初始化 第一次比较繁琐 但是我们可以经过封装,以后就不用编写了
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = configuration.getStandardServiceRegistryBuilder().build();
sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
@Test
public void test() {
Student s = new Student("王麻子", "男");// 临时状态
session.save(s);// 临时状态转变为游离状态
}
@After
public void onDestory() {
transaction.commit();
session.close();
sessionFactory.close();
}
}
save:保存操作,将对象从临时状态转变为持久状态
在保存save操作之前我们进行setId不会报错,但是没有作用,在save()方法后进行setID方法报错;
总结:1)执行save方法会执行Insert语句,对象会从临时状态转变为持久状态
2)在save()前执行setId没有任何作用,但是不报错;之后执行报错;给对象设置Id,我们称之为OID,他和数据库的id是一致的;
3) 在save()之后,对对象进行修改,不用在操作updata()方法,只有在Transaction.commit()阶段,才会通过比较判断是否需要updata()
Presist:和Save()方法的作用一样,但是有细微差别
Presist和Save之间的区别:
一方面:照顾JPA的用法习惯
另外一方面:session.save()返回的是该方法返回该持久化对象的标识属性值(即对应记录的主键值),而presist是无返回的;
给出源码
Serializable save(Object object);
void persist(Object object);
get/Load 通过id值加载对象,参数1是对象的类型,参数2是id值
区别1:get正常加载,load是懒加载;
区别2:当对象id不存在的时候,get返回为null,load返回为报错;
区别3:get得到是其本身,而load得到的是代理对象
总结Load和Get区别:
-
get正常加载,load是懒加载;
-
当对象id不存在的时候,get返回为null,load返回为报错;
-
get得到是其本身,而load得到的是代理对象
SaveOrUpdata:是save和updata的结合体,根据当前对象的状态不同执行不同的操作;具体是如果当前对象是临时态,执行save()操作,如果当前对象是游离态,执行Updata()操作
Update:a:更新一个对象在数据库中的情况,使其从游离态转换为持久态
b:若是更新一个持久层对象,不需要在现实update方法,因为在commit已经flush过了,自动发起update方法;
c:若是关闭一个session,打开一个新的session,那么前一个session对象相对于新的session就是离散的对象了;
evict:将一个对象从持久态转变为游离态
dowork:主要是用来得到原生态的connection