持久化对象的状态有三种:
1、临时状态
2、持久化状态
3、游离状态
持久化状态迁移图:
照着这个图调用相应方法即可完成状态的转换
(1)临时状态
使用new操作符初始化的对象状态是瞬时的。
不处于session的缓存中,不被任何一个session实例关联;在数据库中没有对应的记录。
进入临时状态:
通过new语句,它处于临时状态,此时在数据库中没有对应的记录。
session 的delete(方法能使一个持久化状态的对象或游离状态的对象转变为临时状态的对象。
//创建User对象
User user = new User();
(2)持久化状态
持久实例是任何具有数据库标识的实例。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。
它位于session实例的缓存中,和数据库相关记录同步更新。
package co.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.User;
public class Test1{
@Test//单元测试
public void test1() {
//加载配置文件
Configuration config = new Configuration().configure();
//根据配置文件创建会话工厂
SessionFactory factory = config.buildSessionFactory();
//根据会话工厂创建会话
Session session =factory.openSession();
//创建一个事物对象
Transaction trans = session.beginTransaction();
User user = new User();
user.setUsername("小明");
user.setPassword("123456");
//将对象持久化到数据表中
session.save(user);
//提交事务
trans.commit();
//关闭会话
session.close();
//关闭工厂
factory.close();
}
后台在打印语句,说明数据插入成功:
Hibernate: insert into user20 (name, pwd) values (?, ?)
(3)游离状态
session关闭后,持久化状态对象就转变为游离对象,这个对象脱离了数据库,不受hibernate的管理,它不再位于session的缓存中。
由图可知游离状态的对象是由持久化对象转变过来的,稍微改进下上面的单元测试代码。
User user = new User();
user.setUsername("小明");
user.setPassword("123456");
//将对象持久化到数据表中
session.save(user);
session.evict(user);
//session.delete(user);
//session.close();
//session.evict(user);
这样数据库后台就插入了空数据,表示有数据进来,但是没同步更新。
附加:
游离状态转回临时状态调用delete()测试效果:
User user = new User();
user.setUsername("小明");
user.setPassword("123456");
//将对象持久化到数据表中
session.save(user);
session.delete(user);
//session.close();
//session.evict(user);
Hibernate: insert into user20 (name, pwd) values (?, ?)
Hibernate: delete from user20 where id=?
01:53:02.958 [main] ERROR org.hibernate.engine.jdbc.batch.
internal.AbstractBatchImpl - HHH000352: Unable to release batch statement...