瞬时状态:没有id,没有在缓存session中
持久化状态:有id,在缓存session中
游离|托管状态:有id,没有在缓存session中
瞬时状态=>save=>根据主键生成策略生成id,并放到session缓存中=>持久化状态
瞬时状态=>setId()=>手动设置id=>游离|托管状态=>update()=>放到session缓存中=>持久化状态
持久化状态=>session.close()=>游离|托管状态
没有id(瞬时状态);有id(游离状态)=>saveOrUpdate()=>持久化状态
持久化状态=>提交事务=>真正保存到数据库中
Test.java:
package cn.xxx.demo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.xxx.domain.Customer;
import cn.xxx.utils.HibernateUtils;
//对象的三种状态
public class Test {
@Test
//实体对象的三种状态
public void fun1(){
//1 获得session
Session session = HibernateUtils.openSession();
//2 控制事务
Transaction tx = session.beginTransaction();
//3执行操作
Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态
c.setCust_name("联想"); // 瞬时状态
session.save(c); // 持久化状态, 有id,与session有关联
//4提交事务.关闭资源
tx.commit(); // 只有提交事务时,才会真正保存到数据库。
session.close();// 游离|托管 状态, 有id , 没有关联
}
@Test
//三种状态特点
//save方法: 其实不能理解成保存.可以理解成将瞬时状态转换成持久状态的方法.(只是为了获取id)(根据主键生成策略生成id,执行任意的增删改查都会与session产生关联)
//主键生成策略,主键自增(identity):执行save方法时,为了将对象转换为持久化状态.必须生成id值.所以需要执行insert语句生成.(提交事务才真正保存)
//主键生成策略increment: 执行save方法,为了生成id.会执行查询id最大值的sql语句,并不会执行insert语句。(提交事务后才会真正保存到数据库)
public void fun2(){
//1 获得session
Session session = HibernateUtils.openSession();
//2 控制事务
Transaction tx = session.beginTransaction();
//3执行操作
Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态
c.setCust_name("联想"); // 瞬时状态
session.save(c); // 持久化状态, 有id,有关联。并没有保存到数据库,只是根据id生成策略获取id;提交事务后才保存到数据库。
//4提交事务.关闭资源
tx.commit();
session.close();// 游离|托管 状态, 有id , 没有关联
}
@Test
//三种状态特点
// 持久化状态特点: 持久化状态对象的任何变化都会自动同步到数据库中.
public void fun3(){
//1 获得session
Session session = HibernateUtils.openSession();
//2 控制事务
Transaction tx = session.beginTransaction();
//3执行操作
Customer c = session.get(Customer.class, 1l); //持久化状态对象
c.setCust_name("微软公司"); // 持久化状态的对象进行修改。提交事务后,会自动更新到数据库中。
//4提交事务.关闭资源
tx.commit();
session.close();// 游离|托管 状态, 有id , 没有关联
}
}
HibernateUtils.java(Hibernate连接数据库的工具类):
package cn.xxx.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory sf; // 一个web中只需要一个SessionFactory对象。
static{
//1 创建Configuration对象,默认加载src下的hibernate.cfg.xml配置文件
Configuration conf = new Configuration().configure();
//2 根据配置信息,创建 SessionFactory对象
sf = conf.buildSessionFactory();
}
//获得session => 获得全新session
public static Session openSession(){
//3 获得session
Session session = sf.openSession();
return session;
}
//获得session => 获得与线程绑定的session(当前session)
public static Session getCurrentSession(){
//3 获得session
Session session = sf.getCurrentSession();
return session;
}
}