为了测试的方便,写了一个小工具类(注意:在测试之前务必要到hibernate所需要使用的jar包)
public class HibernateUtils {
private static SessionFactory factory;
//ThreadLocal:线程的本地变量,内部是map集合key为线程值为指定的类型,
//解决线程安全,保证每个线程都有自己的变量
private static ThreadLocal<Session> local;
static {
factory=new Configuration().configure().buildSessionFactory();
local=new ThreadLocal<>();
}
//安全的Session,保证了每个线程就一个Session
public static Session openSession() {
//Thread.currentThread();
if(local.get()==null) {
local.set(factory.openSession());
}
return local.get();
}
public static Session getCurrentSession() {
return factory.getCurrentSession();
}
}
1)瞬时态/临时态——当前对象就是与session无关
——》 不能变为游离态
@Test
public void test1(){
Session session = HibernateUtils.openSession();
User user = new User("tt","111",new Date());//临时态
// 如果save成功,则为持久态,如果save失败则为临时态
System.out.println("保存:"+session.save(user));//持久态
System.out.println(user.getId());//持久态
session.close();
System.out.println(user.getUsername());//游离态
}
2)持久态——当前对象在session中,数据库有数据;持久态的对象的属性变化会在事务提交的时候,将变化结果更新到数据库
持久态——》游离态
close:关闭 清空缓冲区
clear:清空 清空缓冲区
evict:清除指定对象(一个)
持久态——》瞬时态
delete:删除
@Test
public void test2(){
Session session = HibernateUtils.openSession();
Transaction tran = session.beginTransaction();
User user = session.get(User.class, 1);//持久态
// 持久态的对象的属性变化会在事务提交的时候讲变化结果更新到数据库
// session通信的管道:数据库与外界进行通信
session.evict(user);//从缓冲区移除指定对象,游离态
// session.clear();
user.setPassword("222");//游离态:并没有对数据库中的内容进行修改操作
User user2 = session.load(User.class, 2);
// 从数据库中删除并且从session中移除
session.delete(user2);
System.out.println(user2.getUsername());//瞬时态
// 在持久对象在属性内容发生变化时,也就是提交前,会自动调用update对其进行修改操作
tran.commit();
session.close();
}
3)游离态——曾经与session有关,只是现在从session移除,数据库中有数据
游离态——》持久态
save、update、saveOrUpdate
游离态——》瞬时态
delete
@Test
public void test3(){
Session session = HibernateUtils.openSession();
Transaction tran = session.beginTransaction();
User user = session.get(User.class, 1);//持久态
System.out.println(user);
session.evict(user);//游离态
// session.saveOrUpdate(user);//持久态
session.delete(user);//瞬时态
tran.commit();
session.close();
}
也许图形能更加方便进行理解