hibernate中对象状态

对象的状态

临时状态

new出的对象

持久化状态

get,save,update

脱管状态

clear  close  evict

session.get方法取出一个持久化对象,同时产生这个对象的快照,如何判断何时对该对象进行update操作?将快照和该对象进行对比,当快照值和对象值不一致的时候,发出update语句,否则不发。

主键生成器改为identity

session.save(person);

session.evict(person);

transaction.commit();

session执行save操作时候,就发出了insert语句。执行evict操作时候,person对象转为为托管状态。事务提交,因为已经发出过了insert语句了,person虽然为托管状态,但是不影响事务的提交,所有和数据库发生了交互。

import org.hibernate.Session;    
    import org.hibernate.Transaction;
    import org.junit.Test;
     
    import cn.itcat.domain.ConfigUtil;
    import cn.itcat.domain.Person;
     
    public class StateTest extends ConfigUtil{
    /**
     * session.save方法把一个临时状态的对象转化成持久化状态的对象
     */
    @Test
    public void testSavePerson(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = new Person();
    person.setPname("afds");
    person.setPsex("af");
    session.save(person);
    transaction.commit();
    session.close();
    }
    /**
     * session.update方法可以把一个对象的状态变成持久化状态
     */
    @Test
    public void testUpdate(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person2 = new Person();//临时状态
    person2.setPid(1L);//临时状态
    session.update(person2);//updat方法是将一个临时状态的对象转化为持久化状态对象
    transaction.commit();//发出sql语句
    session.close();
    }
    /**
     * 当session.get方法得到一个对象的时候,是不需要再执行 update语句,因为已经是持久化状态
     * 当一个对象是一个持久化对象的时候,当进行提交的时候,hibernate内部会让该对象和快照进行对比,如果一样,则不发出update语句
     * 如果不一样,则发出update语句
     */
    @Test
    public void testGet(){
    Session session = sessionFactory.openSession();
    //Transaction transaction = session.beginTransaction();
    Person person = (Person)session.get(Person.class, 1L);//get取出的对象就是一个持久化对象
    person.setPname("tt");
    //session.update(person); 
    //transaction.commit();
    session.close();
    }
    /**
     * session.clear方法把所有的对象从session中清空
     */
    @Test
    public void testClear(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = (Person)session.get(Person.class, 1L);
    person.setPname("asd");
    session.clear();//把session中所有的对象清空
    session.update(person);//把对象从脱管状态转化成持久化状态
    transaction.commit();
    session.close();
    }
    /**
     * session.evict把一个对象从session中清空
     */
    @Test
    public void testEvict(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = (Person)session.get(Person.class, 1L);
    person.setPname("asdsss");
    session.evict(person);//脱管状态
    session.update(person);//把对象的状态转化成持久化状态
    transaction.commit();
    session.close();
    }
    /**
     * 一个对象是否是持久化对象是针对某一个session而言的
     */
    @Test
    public void testSession(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = (Person)session.get(Person.class, 1L);
    person.setPname("asfd");
    transaction.commit();
    session.close();
    session =  sessionFactory.openSession();
    transaction =  session.beginTransaction();
    person.setPname("aaaaaaa");//person对象对于94的session来说是一个临时状态的对象
    //session.update(person);
    transaction.commit();
    session.close();
    }
    /**
     * 当执行transaction.commit的时候,hibernate内部会检查session
     *    1、如果一个对象为临时状态的对象,则session不会管
     *    2、如果一个对象是持久化状态的对象,如果有ID值,并且和数据库对应,那么先把该对象与快照进行对比,如果一致,则什么都不做,如果不一致,则发出update语句
     *    3、如果一个对象是持久化状态的对象,如果没有ID值,则会发出save语句
     */
    @Test
    public void testMuplyOption(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = new Person();
    person.setPname("rrr");
    person.setPsex("asdfasdf");
    Person person3 = new Person();
    person3.setPname("rrr");
    person3.setPsex("asdfasdf");
    session.save(person);
    Person person2 = (Person)session.get(Person.class, 1L);
    person2.setPname("afds45");
    transaction.commit();
    session.close();
    }
    @Test
    public void testMutiplyOption2(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = new Person();
    person.setPname("asdfads");
    person.setPsex("er");
    session.save(person);
    transaction.commit();
    session.evict(person);
    session.close();
    session = sessionFactory.openSession();
    transaction = session.beginTransaction();
    session.update(person);
    session.clear();
    transaction.commit();
    session.close();
    }
    @Test
    public void testTransaction(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = (Person) session.get(Person.class, 1L);//这个person在 第一个事务之中
    person.setPname("11"); //person在第一个session的事务中
    session =sessionFactory.openSession();//这是第二个session,如果把这个session给注释了,那么第一个session开启了两个事务,即使第一个事务不提交,第二个事务提交,仍然可以和数据库发生交互,因为这两个事务都在同一个session中
    Transaction transaction2 = session.beginTransaction();
    person.setPname("22"); //person在第一个session的事务中
    transaction2.commit();
    //transaction.commit();//第一个session的事务不提交,不会和数据库发生交互
    session.close();
           }
    }
时间: 2024-12-10 23:57:31

hibernate中对象状态的相关文章

Hibernate学习笔记(二) — 探索 hibernate 中对象的状态

一.hibernate中对象的状态有三种: 临时.游离和持久化,三种状态转化的方法都是通过session来调用的 什么是持久化? 通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存) 二.三种状态的相互转换 session方法 session.save():该方法可以把一个对象从临时装填转换成持久化状态 session.get():从数据库中根据主键提取出一个对象,该对象就是一个持久化状态的对象 session.update():把一

ORM进阶之Hibernate中对象的三大状态解析

ORM进阶之 ORM简单介绍 ORM进阶之Hibernate简单介绍及框架搭 ORM进阶之Hibernate的三大对象 ORM进阶之Hibernate中对象的三大状态解析 在Hibernatea中每一个对象都有三种状态,他们在这三种状态下,Hibernate会他们进行不同的处理.下边我们通过一张图来看一下这三种状态以及他们之间的互相转换! 能够看到对象可能会有这三种状态.暂时状态(transient),持久化状态(persistent).游离状态(detached).下边我们来分别来解释一下这三

Hibernate中对象的三种状态,以及三种状态间的转化方法

在Hibernate中有三种状态,对它的深入理解,才能更好的理解hibernate的运行机理,刚开始不太注意这些概念,后来被别人问到了,说是面试题,才发现它是重要的.对于需要持久化的JAVA对象,在它的生命周期中有三种状态,而且互相转化. Hibernate三种状态之一:临时状态(Transient):也叫瞬时状态,在一个对象刚被创建的时候,比如People people = new People(),它没有持久化,并没有处于Session的缓存中,这种状态的对象叫就是临时对象: Hiberna

(09)Hibernate中对象的状态

Hibernate中对象的状态: 临时/瞬时状态.持久化状态.游离状态. Hibernate中的对象状态 序号 状态 特点 1 临时状态 a. 直接new出来的对象; [内存] b. 不处于session的管理;[session] c. 数据库中没有对象的记录;[数据库] 2 持久化状态 a. 处于session的管理; b. 数据库中有对应的记录; 说明:当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态.          

关于hibernate中对象的三种状态分析

一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load():持久态到瞬态的方法有delete():游离态到持久态的方法有update().saveOrUpdate().lock():持久态到游离态的方法有:session.close().session.evict().session.clear(). 二,Hibernate的状态 hibernate的

hibernate中对象的三种状态分析

一,首先hibernate中对象的状态有 三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate(). get().load():持久态到瞬态的方法有delete():游离态到持久态的方法有update().saveOrUpdate(). lock():持久态到游离态的方法有:session.close().session.evict().session.clear(). 二,Hibernate的状态 hiberna

hibernate中对象集合的保存

一.在java web设计中经常使用对象进行操作,在hibernate中对象集合的保存(一对多) 1需要进行如下步骤: 1) 设计数据表关系 2)引入jar包,需要注意引入数据库connector 3)写实体类 4)配置映射文件和hibernate.cfg.xml 2例子如下: 员工和部门的关系,多个员工属于一个部门,一个部门有多个员工.可以在员工表上设置一个外键解决一对多的关系. 2.1)创建表 CREATE TABLE employee( id INT PRIMARY KEY AUTO_IN

Hibernate中对象的三个状态解析

Hibernate 将操作的对象分为三种状态: 1. 瞬时 (Transient )/临时状态/自由状态 持久 (Persistent) 脱管 (Detached) 瞬时对象特征: 第一.不处于 Session 的缓存中,也可以说,不被任何一个 Session 实例关联. 第二.在数据库中没有对应的记录. 持久化对象特征: 第一.持久化对象总是被一个 session 关联. 第二.持久化对象与数据库中的记录对应. 第三.Session清理缓存的时候,会根据持久化对象的改变,更新数据库. 托管对象

Hibernate中对象的三种状态

一  . 在hibernate中,对象有三种状态:临 时状态(Transient).持久状态(Persistent)和游离状态(Detached). 处于持久态的对象也称为 PO(PersistenceObject),临时对象和游离对象也称为VO(ValueObject). 1. 临时状态 由 new命令开辟内存空间的Java对象,例如: User user=new User(); 临 时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系. (a) 如 果没有变量对该对象进行