①、临时状态 使用 new语句创建出来的对象 属于 "临时状态",数据只存在与内存中的,目前数据还未存放到数据库中
②、持久化状态 临时状态的数据,使用 save() 或者 saveOrUpdate() 方法,可以将数据从 "临时状态" 转变成 "持久化状态"
③、游离状态 持久化状态的数据,可以使用 evict() 或者 close() 或者 clear() 方法,将数据从 "持久化状态" 转换为 "游离状态"
游离状态的数据,可以使用update() 或者 saveOrUpdate() 或者 lock() 方法,将数据从 "游离状态" 转换为 "持久化"
联想记忆:
临时状态 可以理解为 单身状态
持久化状态 可以理解为 已婚状态
游离状态 可以理解为 离异状态
1、人在最初的时候都是单身状态
2、通过结婚,人才能从原来的单身状态 转变 到已婚状态
3、已婚状态的部分人,由于某种原因要分开,分开后的人将由已婚状态 转变为 离异状态
4、离异的人的部分人,由于某种特殊的需求,需要从离异状态 转变为 已婚状态
临时状态对象特征:
①、使用 new 创建出来的对象,没有设置 id 属性
②、没有被 session 托管,换句话说 对象数据 存放在内存中, 没有存放到 session 缓存中
③、临时对象数据 与 数据库中的数据 还没任何关联
持久状态对象特征:
①、要么是从数据库中使用 get 或 load 方法查询到的数据对象, 要么是 使用save 或 update 方法数据转变成持久层对象
②、对象 数据被 session 托管。换句话说 对象数据 在 session 缓存中有一份,在数据库中有相应的记录
游离状态对象特征:
①、主要是通过 持久状态对象,调用 session.evict() 或 session.clear() 或 session.close() 得到的,也可以new 一个设置 id 值的对象
②、session 缓存中没有,内存中有的对象(注: 该对象设置了 id 值)
测试公共代码
SessionFactory sessionFactory;
Session session;
Transaction transaction;
@Before
public void init(){
Configuration cfg = new Configuration().configure();
ServiceRegistry reg = cfg.getStandardServiceRegistryBuilder().build();
sessionFactory = new MetadataSources(reg).buildMetadata().buildSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
@After
public void destory(){
session.flush();
transaction.commit();
session.close();
sessionFactory.close();
}
案例1、
@Test
public void test5(){
Student student = new Student("zs",18);
session.save(student);
student.setName("zwj");
}
PS:①、Student student = new Student("zs",18); 内存中会创建 student 对象
②、session.save(student); 将 student 对象交给 session托管,此时会在session 缓存中存放一份,同时发起 insert 语句将数据存放到数据库
③、student.setName("zwj"); 内存中的数据发生了修改(可以是多次修改),此时 内存中的student 对象 与 session缓存中的 student 对象是不一致的
④、transaction.commit(); 当执行 commit() 方法时,会默认先调用 flush() 方法,将数据同步到数据库中。此时如果 缓存中的数据 与 数据库中的数据不一致,会发送一条update 语句
案例2、
@Test
public void test6(){
Student student = new Student();//临时状态
student.setId(new Long(100));
student.setName("珠穆朗玛");
session.save(student);
}
@Test
public void test7(){
Student student = new Student();//临时状态
student.setName("好好学习");
session.save(student);
student.setId(new Long(989));
}
PS: session.save() 方法之前设置对象的id 是无效的, 方法之后设置对象id 会报错,报错原因是持久化对象的 id 是不能修改
案例3、
@Test
public void test8(){
Student student = new Student();//临时状态
student.setId(new Long(7));//找一个数据库里有的数据
session.delete(student);
}
PS:构造一个有id值的对象, 然后调用session.delete() 方法删除,如果该对象在 session 缓存中有, 那么会先删除 session 缓存中的数据,然后再删除数据库中的数据
案例4、(session.saveOrUpdate())
@Test
public void test9(){
Student student = new Student("海绵宝宝12",12);//临时状态
student.setId(new Long(120));//从临时状态 到 游离状态
session.saveOrUpdate(student);
}
PS:saveOrUpdate 方法是save 方法 和 update 方法结合, 如果对象有 id 那么就调用 update 方法,如果没有id 那么就调用save 方法, 但前提是这个 对象是 在session 缓存中的(换句话说, 自己手工设置的 id 值是不行的)
案例5、(session.saveOrUpdate())
@Test
public void test11(){
Student st2 = new Student("12", 12);//临时状态
session.saveOrUpdate(st2);
}
案例6、(session.saveOrUpdate())
@Test
public void test10(){
Student student = session.get(Student.class, new Long(10));
student.setName("xyz");
session.saveOrUpdate(student);
}
①、session.save(obj) 方法通常用于保存新对象,即没有 id 值的对象,因为即使手动设置id值,在save() 到数据库也不会使用这个 id 值。
②、session.update(obj) 这个方法通常用于更新 数据对象,数据对象通常都在 session 缓冲中存在的。即是 使用 load 或 get 方法得到的 数据对象
③、session.delete(obj) 方法通常用于删除对象,可以构建一个有 id 值的对象,然后删除。需要注意的是 这个id 值在数据库中必须存在,否则会报错
④、session.saveOrUpdate(obj); 这个方法通常不使用,因为手工设置id 执行该方法会报错,get 方法得到的数据对象,经常出现无法更新