一、打开oracle数据库,登录scott账户,对scott账户进行测试
二、新建一个java项目,导入hibernate配置文件及scott账户下测试表的映射文件
1.创建java项目
2.打开DB Broweser,创建数据库连接
3.在java项目中,先导入hibernate配置文件,再导入hibernate映射文件、映射类
导入hibernate映射文件、映射类
三、测试Hibernate中Java对象的三种状态及其转换
1.主方法
/**
* 测试Hibernate中Java对象的三种状态<br/>
* 瞬时状态(Transient)<br/>
* 持久状态(Persistent)<br/>
* 游离状态(Detached)<br/>
*
* @param args
*/
public static void main(String[] args) {
// t1();//java对象从瞬时状态转化为持久状态
// t2();//java对象从瞬时状态转化为持久状态,在变为游离状态,对游离态的操作不会影响数据库
// t3();//将游离对象使用update()重新关联到session,变为持久态
t4();//将对象从持久状态变为瞬时状态,数据库中没有记录与其对应
}
2.java对象从瞬时状态转化为持久状态
/**
* java对象从瞬时状态转化为持久状态
*/
private static void t1() {
//1.加载hibernate配置文件
Configuration config = new Configuration().configure();
//2.创建sessionFactory
SessionFactory sessionFactory = config.buildSessionFactory();
//3.打开session
Session session = sessionFactory.openSession();
//4.开启事务
Transaction transaction = session.beginTransaction();
//5.数据库操作
//瞬时状态,数据库中没有记录与其对应
Dept d = new Dept();
d.setDname("111111");
session.save(d);
//对象d转换为持久态,数据库中一定有记录与其对应,并且对持久态的操纵就是对数据库的操作
d.setDname("222222");
//6.提交事务
transaction.commit();
//7.关闭session
session.close();
//8.关闭sessionFactory
sessionFactory.close();
}
运行:
查询:
可以看到数据库中新增了一条记录,并且插入的dname的值为222222,不是111111.再看hibernate的提示信息,先查询最大的deptno,再执行插入语句insert,最后执行一个更新语句update。说明new 一个瞬时对象d后,执行session.save()方法后变为持久对象,在通过d.setDname()对其操作,此时操作的就是持久态对象,操作持久态对象就是操作数据库,最终插入的值就是“222222”.
3.java对象从瞬时状态转化为持久状态,在变为游离状态,对游离态的操作不会影响数据库
/**
* java对象从瞬时状态转化为持久状态,在变为游离状态,对游离态的操作不会影响数据库
*/
private static void t2() {
//1.加载hibernate配置文件
Configuration config = new Configuration().configure();
//2.创建sessionFactory
SessionFactory sessionFactory = config.buildSessionFactory();
//3.打开session
Session session = sessionFactory.openSession();
//4.开启事务
Transaction transaction = session.beginTransaction();
//5.数据库操作
//瞬时状态,数据库中没有记录与其对应
Dept d = new Dept();
d.setDname("111111");
session.save(d);
//对象d转换为持久态,数据库中一定有记录与其对应,并且对持久态的操纵就是对数据库的操作
d.setDname("222222");
//6.提交事务
transaction.commit();
//7.关闭session
session.close();
/**
* 当session关闭后,持久态对象就会变成游离状态<br/>
* 游离状态的特点是数据库可能有也可能没有记录对应<br/>
* 对游离对象进行的操作不会影响数据库<br/>
*/
d.setDname("333333");
//8.关闭sessionFactory
sessionFactory.close();
}
运行结果:
查询数据库结果:
从查询数据库的结果可以看到,在session关闭后对其进行操作d.setDname("333333"),
数据库中的结果依然是之前的结果,“222222”。
因为session关闭后d对象变为游离态,对游离态操作不会影响数据库。
4.将游离对象使用update()方法重新关联到session,变为持久态对象
/**
* 将游离对象使用update()重新关联到session,变为持久态
*/
private static void t3() {
//1.加载hibernate配置文件
Configuration config = new Configuration().configure();
//2.创建sessionFactory
SessionFactory sessionFactory = config.buildSessionFactory();
//3.打开session
Session session = sessionFactory.openSession();
//4.开启事务
Transaction transaction = session.beginTransaction();
//5.数据库操作
//瞬时状态,数据库中没有记录与其对应
Dept d = new Dept();
d.setDname("111111aaaaaa");
session.save(d);
//对象d转换为持久态,数据库中一定有记录与其对应,并且对持久态的操纵就是对数据库的操作
d.setDname("222222bbbbbb");
//6.提交事务
transaction.commit();
//7.关闭session
session.close();
/**
* 当session关闭后,持久态对象就会变成游离状态<br/>
* 游离状态的特点是数据库可能有也可能没有记录对应<br/>
* 对游离对象进行的操作不会影响数据库<br/>
*/
d.setDname("333333cccccc");
//将游离对象使用update()重新关联到session,可以再次变为持久态对象
Session s1 = sessionFactory.openSession();
Transaction tx = s1.beginTransaction();
s1.update(d);
tx.commit();
//8.关闭sessionFactory
sessionFactory.close();
}
运行结果:
查询数据库的结果:
可以看到,session关闭后操作d.setDname("333333cccccc");重新创建了一个session,执行是s1.update(d);将游离态变为持久态,插入数据“333333cccccc”.
5.将对象从持久状态变为瞬时状态,数据库中没有记录与其对应
/**
* 将对象从持久状态变为瞬时状态,数据库中没有记录与其对应
*/
private static void t4() {
//1.加载hibernate配置文件
Configuration config = new Configuration().configure();
//2.创建sessionFactory
SessionFactory sessionFactory = config.buildSessionFactory();
//3.打开session
Session session = sessionFactory.openSession();
//4.开启事务
Transaction transaction = session.beginTransaction();
//5.数据库操作
//瞬时状态,数据库中没有记录与其对应
Dept d = new Dept();
d.setDname("aaaaaa");
/**
* 执行session的save方法对象从瞬时状态变为持久状态<br/>
* 对持久状态的操作就是对数据库的操作
*/
session.save(d);
/**
* 执行session的delete方法对象d变为瞬时状态<br/>
* 瞬时状态,数据库中没有记录与其对应
*/
session.delete(d);
//6.提交事务
transaction.commit();
//7.关闭session
session.close();
/**
* 当session关闭后,持久态对象就会变成游离状态<br/>
* 游离状态的特点是数据库可能有也可能没有记录对应<br/>
* 对游离对象进行的操作不会影响数据库<br/>
*/
d.setDname("cccccc");
//将游离对象使用update()重新关联到session,可以再次变为持久态对象
Session s1 = sessionFactory.openSession();
Transaction tx = s1.beginTransaction();
s1.update(d);
tx.commit();
//8.关闭sessionFactory
sessionFactory.close();
}
运行结果:
查询数据库的结果:
可以看到执行session.delete(d)后,后面的操作都没有插入成功。瞬时对象用update不能变为持久对象。
四、总结
1.hibernate中Java对象的三种状态
2.hibernate中Java对象三种状态之间的转换