• hibernate对象三种状态


    hibernate里对象有三种状态:

    1,Transient 瞬时 :对象刚new出来,还没设id,设了其他值。

    2,Persistent 持久:调用了save()、saveOrUpdate(),就变成Persistent,有id

    3,Detached  脱管 : 当session  close()完之后,变成Detached。

    例子程序:

    Teacher类:

     1 package com.oracle.hibernate.id;
     2 
     3 import javax.persistence.Entity;
     4 import javax.persistence.GeneratedValue;
     5 import javax.persistence.Id;
     6 
     7 @Entity
     8 public class Teacher {
     9 
    10     
    11     
    12     private int id;
    13     private String name;
    14     
    15     private String title;
    16 
    17     @Id
    18     @GeneratedValue
    19     public int getId() {
    20         return id;
    21     }
    22 
    23     public void setId(int id) {
    24         this.id = id;
    25     }
    26 
    27     public String getName() {
    28         return name;
    29     }
    30 
    31     public void setName(String name) {
    32         this.name = name;
    33     }
    34 
    35     public String getTitle() {
    36         return title;
    37     }
    38 
    39     public void setTitle(String title) {
    40         this.title = title;
    41     }
    42     
    43     
    44 }
    View Code

    测试类:

    package com.oracle.hibernate.id;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.AnnotationConfiguration;
    import org.hibernate.cfg.Configuration;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    public class HibernateCoreAPITest {
    
        private static SessionFactory sf = null;
    
        @BeforeClass
        public static void beforeClass() {
            // try-chatch是为了解决Junit有错误不提示的bug
            try {
    
                sf = new AnnotationConfiguration().configure()
                        .buildSessionFactory();
            } catch (HibernateException e) {
    
                e.printStackTrace();
            }
        }
    
        @Test
        public void testTeacher() {
    
            Teacher t = new Teacher();
            // 没有设id
            t.setName("li");
            t.setTitle("high");
            // 执行到此时,状态为transient。
    
            // 在内存中有一个session对象,
            Session session = sf.getCurrentSession();
    
            session.beginTransaction();
            // save后变成persistent
            session.save(t);
    
            // 打印出id
            System.out.println(t.getId());
            // commit后自动close session,变成detached状态
            session.getTransaction().commit();
    
        }
    
        @AfterClass
        public static void afterClass() {
            sf.close();
        }
    
    }
    View Code

    代码详细解读,内存分析:

    1,当Theacher   t  = new  Teacher(); t.setXXX后,此时的t是没有id的,只是在内存中有了一个Teacher对象t。此时状态就是transient。

    2,当执行Session session = sf.getCurrentSession();内存中会有一个Session对象,session对象里有一个hashmap,他其实就是缓存:内存中的一块区域,放着一系列想要的提高读取效率的对象(的引用)。这个HashMap的key,是用来保存将要持久化的对象的id,value保存我们的对象,在这里就是t,其实是保存对象的引用,指向t对象。这都是准备工作,没有调用save方法,里边什么都没有。当执行了session.save(t);就在session的缓存里就有了t对象,key里有了id 1,value指向t对象。调用save方法的同时,会发出insert语句,在数据里也就有了t对象。

    所以save完之后,内存里有t对象,数据库里也有t对象,称为persistent状态。

    这样做的好处是:

    提高效率,如果要找id=1的对象,直接从内存里去查,而不用去数据库里找。

    3,当执行了session.getTransaction().commit();session自动关了,session对象没有了,缓存也没了。看图可知,此时t对象在内存中还有,只是HashMap指向t没了。t对象已经脱离了session的管理,称为detached  脱管状态。

    总结:

    hibernate对象三种状态的区分关键在于:

      a)有没有id

      b)id在数据库中有没有

      c)在内存中有没有(session缓存)

    三种状态:

      a) transient :内存中一个对象,没id,缓存中也没有

      b)persistent:内存中有对象,缓存中有,数据库中有(id)

      c)detachd:内存有对象,缓存没有,数据库有

  • 相关阅读:
    easyui combo自动高度(下拉框空白问题)
    log4net
    asp.net mvc 生成条形码
    Kubernetes 初探
    美国最顶级的投资机构在关注什么
    Ansible--01
    第一章 进入java的世界
    正则表达式
    zabbix接口调用注意事项--Python
    Docker+K8S实践
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/4854186.html
Copyright © 2020-2023  润新知