hibernate(二)
2021-02-05 22:16
标签:style span mic 游离 onclick 判断 指定 打印 show 目录: 对象的三种状态 如何判断: 1)对象有 id 与数据库有关联 2)使用 session 操作过 对象 与 Hibernate 有关联 HibernateUtils 测试代码 2、 --- hibernate(二) 标签:style span mic 游离 onclick 判断 指定 打印 show 原文地址:https://www.cnblogs.com/xy-ouyang/p/13121488.html1、对象的三种状态
1)瞬时态(或临时态): 没有与Hibernate产生关联,与数据库中的记录没有产生关联(有关联就是与数据库中的 id 有关联)
2)持久态: 与Hibernate有关联,与数据库有关联(对象有 id)
3)游离态(或托管态): 与Hibernate没有关联,与数据库有关联(对象有 id)package com.oy.helloworld;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
// 会话工厂,整个程序只有一份。
private static SessionFactory sf;
static {
// 1 加载配置
Configuration config = new Configuration().configure();
// 2 获得工厂
sf = config.buildSessionFactory();
// 3 关闭虚拟机时,释放SessionFactory
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
System.out.println("虚拟机关闭!释放资源");
sf.close();
}
}));
}
// 获得一个新的session
public static Session openSession() {
return sf.openSession();
}
// 获得当前线程中绑定session
public static Session getCurrentSession() {
return sf.getCurrentSession();
}
}
public class TestHelloWorld {
@Test
public void fun1() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
// ===========================================
User u = new User(); // 临时态
u.setUsername("tom"); // 临时态
u.setPassword("333"); // 临时态
// save 方法会使用主键生成策略,为 User 指定 id
session.save(u); // 持久态: 与Hibernate有关联,与数据库有关联(对象有 id)
// ===========================================
session.getTransaction().commit(); // 持久态
session.close(); // 游离态
}
}
@Test
public void fun2() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
// ===========================================
User u = (User) session.get(User.class, 1); // 持久状态
u.setUsername("jerry");
session.update(u); // 多余代码,Hibernate会自动将持久化状态对象的变化同步到数据库中,无需该代码
// ===========================================
session.getTransaction().commit();// 持久状态,打印update语句
session.close(); // 游离状态
}