• Hibernate学习2--对象的三种状态以及映射关系的简单配置


    上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态。

    一、hibernate缓存的概念

      1、session与缓存的关系。在hibernate中,有时候,会把session称作一级缓存,这是因为,session所管理的java beans对象其实就相当于一个内存中数据库的一个缓存。session和bean以及缓存的概念关系图可以参考以下的图:

    所以,上图大概说明了缓存区,session和bean的关系:当bean被session进行管理后,它也就被持久化了,也就相当于在缓存区中了。

    而如何进行持久化,上篇hibernate的博客也都说过了,这里不详细讲。

    二、hibernate中,bean的三种状态

      1、状态一:临时状态。当对象刚刚被创建出来(直接new)而且没有关联任何session时,便处于这种状态。这时,它和其他的java普通对象没什么大区别,它和数据库也没有任何关联。

      2、状态二:持久化状态,这时候,对象关联了数据库,处在session的托管之下,可以直接操作对象达到操作数据库的效果。上篇博客也稍微提到了持久化的方法,下面具体说说hibernate中如何对象持久化。

    方法一:直接通过save (saveOrUpdate)方法:

    //调用session进行对象持久化
    		session.save(person);
    		//当然也可以这样持久化:session.saveOrUpdate(person);
    

      save和saveOrUpdate的区别:前者直接将临时的对象变为持久化化状态,后者也可以达到同样的目的,只是后者多了一层这样的含义:当对象处于临时状态时,进行save操作,当对象处于游离或者持久状态(游离状态稍后介绍)时进行update操作。

      3、状态三:游离状态,当调用session的close方法或者调用delete操作时,对象会处于游离状态(假设该bean对象只有一个session托管)。游离状态的对象可以通过saveOrUpdate进行再次托管。

    //当调用delete时,对象处理游离状态(就算进行了删除操作,对象还是在内存中,不会立即销毁,毕竟垃圾回收器还没有工作)
    		session.delete(person);//删除,会删除数据库中的数据,同时将person的托管关系和session断开,person处于游离状态
    		//......事务操作
    		session.close();//当然,如果直接关掉session,也会导致person处在游离状态
    		//下面可以重新托管对象person
    		session.saveOrUpdate(person);//这样,person又重新给托管了
    

      

      显然,对象的三种状态,其实只是对象和hibernate的三种关系罢了,具体的关系参考下面的丑图进行理解:

      4、获取持久化状态对象的其他方法。当在配置文件指明了数据库表和bean的映射关系时,我们可以直接通过session的get方法获取一个持久化对象,而且,该对象已经被初始化,看下面代码:

    //也可以这样直接获取一个持久化对象
    		Person person2 = (Person) session.get(Person.class, 1);//这里通过主键获取,注意主键类型是什么就传什么类型的值
    

      在这里,通过get方法即可获得对象的一个实例,而且该对象已经被持久化了。说到这里,我们需要注意一个问题:就是session可以管理多个对象,但是前提是这些对象的主键(在配置文件中体现)的值不可以重复,否则会出错!

    三、hibernate映射关系的简单配置

      前面的讨论中,我都没有说到如何建立数据库和bean的映射关系,下面简单讨论下映射配置文件的书写问题,先看以下的例子:

    <hibernate-mapping>
    <!-- class标签这里说明了哪个bean对应哪个数据库表 -->
        <class name="DTO.AddressListDTO" table="addresslist">
            <!-- id标签说明了bean的主键是什么,这里说明是对应bean里面一个id变量作为bean的主键 -->
            <id name="id" type="int">
                <!-- 这里column说明了bean主键对应数据库的主键是什么 -->
                <column name="id"/>
                <!-- 说明主键是自增  -->
                <generator class="increment"/>
            </id>
            <!-- property说明了bean的phone变量是什么类型以及对应数据库表的那些字段 -->
            <property name="phone" type="java.lang.String">
            <!-- 说明了对应bean 的phone的变量所对应的数据库字段为phone字段 -->
                <column name="phone" />
            </property>
            <property name="address" type="java.lang.String">
                <column name="address" />
            </property>
            <property name="email" type="java.lang.String">
                <column name="email" />
            </property>
            <property name="userId" type="java.lang.Integer">
                <column name="user_id" />
            </property>
        </class>
    </hibernate-mapping>

    OK,上面的注释也大概说明了如何将bean对象映射到数据库中了,下面的配置文件就是配置hibernate和数据库的关系的配置文件了,也是Configuration().configure()所操作的配置文件(所以直接调用该方法时需要将配置文件放在src源码目录的根目录下)。

    <hibernate-configuration>
        <session-factory>
            <!--MySQL数据库配置-->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://localhost:3306/addresslist</property>
            <property name="connection.username">root</property>
            <property name="connection.password">root</property>
                        
            <!-- 所有访问数据库操作的SQL都会显示,用于调试,发布时应该移除 -->
            <property name="show_sql">true</property>
            
            <!-- 这里就是将上面那个bean和数据库表的映射配置文件导入操作 -->
            <mapping resource="DTO/Member.hbm.xml" />                
        </session-factory>
    </hibernate-configuration>

      

  • 相关阅读:
    Ubuntu 开机启动是出现 grub rescue 解决办法
    OpenvSwitch Port Mirror in OpenStack Neutron
    Protobuf 在Ubuntu 14上的编译与使用
    Linux screen 常用命令
    OpenStack/devstack with Neutron on Ubuntu 14 (1)
    osprofiler在openstack Cinder里的使用
    基于SSH协议的端口转发
    HA 技术简介
    Socket Receive数据一次性接收不全的问题
    【转】本文对C#虚函数virtual进行详解。
  • 原文地址:https://www.cnblogs.com/lcplcpjava/p/6623326.html
Copyright © 2020-2023  润新知