zoukankan      html  css  js  c++  java
  • 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:内存有对象,缓存没有,数据库有

  • 相关阅读:
    Linux Core Dump
    ODP.NET Managed正式推出
    获取EditText的光标位置
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/4854186.html
Copyright © 2011-2022 走看看