• Hibernate 对象的三种状态


    hibernate对象的三种状态:  

      (一) 瞬时(临时)状态:   对象被创建时的状态,数据库里面没有与之对应的记录!    

      (二) 持久状态:   处于session的管理中,并且数据库里面存在与之对应的记录!

      (三) 游离状态:   对象不处于session的管理中,但是数据库里面存在与之对应的记录!

      对象与session产生关系的时机:  

      1、save()或者saveorupdate();

      2、get()或者load();

      清空缓存:  

      1、clear();//清空所有加载的实例  

      2、evict(实例);//从缓存里面移除这个实例——效果同上,需要指定实例,对象

      三种状态的转换过程:  

        

      hibernate涉及的脏检查:

         当事务提交时(commit),hibernate会检查session中处在持久状态的对象, 判断与数据库是否一致,不一致则会将缓存里面的数据更新掉数据库里面的数据!

      

      那么session什么时候刷新缓存:

         1、执行commit方法时  //执行脏检查

         2、session.flush(); //不会提交事务执行脏检查

      更新数据的方法:  

        update(对象):  

        saveOrUpdate(对象):   

          1、通过id查询主键,存在就更新,不存在就新增!   

          2、当mapping配置文件的generator节点的class属性不为assigned时,造成只有update没select时,更改class为assigned可以解决!   

          3、不会发起查询,直接更新  merge(对象):合并,先查询,与缓存里面的数据比较一样时不做任何操作,不一样时,再更新或者插入!效率更高!

          

          

      

    saveOrUpdate(对象)与merge(对象)方法:  

        1、主键生成策略:assigned  

           操作一样!  

        2、主键生成策略:sequence,动态更新(dynamic-update="true")策略  

          saveOrUpdate(对象)只更新   

          merge(对象)先发起一条查询语句,在发起更新或者插入语句

     1     public static boolean addDept(){
     2         boolean flag=false;
     3         Configuration conf=null;
     4         SessionFactory factory=null;
     5         Session session=null;
     6         Transaction trans=null;
     7         try {
     8             //读取配置文件
     9             //指定配置文件
    10             //conf=new Configuration().configure("xxx.cfg.xml");
    11             conf=new Configuration().configure();
    12             //创建sessionfactory
    13             factory=conf.buildSessionFactory();
    14             //打开会话
    15             session=factory.openSession();
    16             //开启事务
    17             trans=session.beginTransaction();    
    18             
    19             Dept dept=(Dept)session.get(Dept.class, 8);
    20             //当设置了gennerator为sequence时,不给参数是以指定sequence填值
    21             //dept.setDeptno(10);
    22             dept.setDeptname("test测试部");
    23             dept.setLoc("xz");
    24             //持久化
    25             //session.save(dept);
    26             //session.delete(dept);
    27             //Dept dp=(Dept)session.get(Dept.class, 1);//没有数据,返回空值
    28             //System.out.println(dp.getDeptname());
    29             //延迟加载
    30             //Dept dp=(Dept)session.load(Dept.class, 5);//没有数据,报异常
    31             //保存或更新
    32             session.saveOrUpdate(dept);
    33             //合并
    34             //session.merge(dept);
    35             //提交事务
    36             trans.commit();
    37             
    38             flag=true;
    39         } catch (Exception e) {
    40             e.printStackTrace();
    41             trans.rollback();
    42         }finally{
    43             if(session!=null){
    44                 session.close();
    45                 
    46             }
    47         }
    saveOrupdate()&merge()

    补充:

      配置文件节点以及属性总结:

      hbm映射配置文件:

        1、通常情况下,一个mapping只写一个class节点,因此一个mapping文件对应一个(类与数据库表);

          class节点:

            name属性:对象的路径,这里指大路径、对象名!

                  也可以在<hibernate-mapping>节点pakage属性指定包路径,只写对象名

            table属性:指定数据库表名,可以忽略大小写

            dynamic-update属性:指定是否动态更新,这个属性在saveOrupdate/merge方法执行时,尤为重要!

          id节点:

           主键配置:oid:object 对象的编号
             name:实体类里面属性的名称;
             column:数据库表里面的列:不写表示和实体类属性名一致!

          generator节点:

            生成器:
                主键的生成策略:通过class设定:
                   assign:由程序指定主键值!
                   foreign:由外键生成!
                   identity:标识列!sqlserver支持!
                   sequence:序列,oracle,db2,!
                   increment:自增,mysql!
                   native:由数据库自己决定以上哪种方式!    

          param节点:

            指定索引名

          property节点:

            type:属性的类型,可以是java类型(要写完全限定名),也可以是hibernate类型!可以省略

        示例:

        

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC 
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     5 <!-- 类和表 属性和字段的关系 -->
     6 <!-- <hibernate-mapping package="cn.cy.Hibernate.entity">  -->
     7 <hibernate-mapping>
     8     <!-- 与关键字冲突   ”~~“解决 -->
     9     <!-- 通常一个mapping只写一个class节点 -->
    10     <!-- 类名和表名可以不一样! -->
    11     <class name="cn.cy.Hibernate.entity.Dept" table="dept" dynamic-update="true">
    12     <!-- <class name="Dept" table="dept"> -->
    13         <!-- 当数据库里面的列明与java属性一致时,我们可以省略colnumn -->
    14         <!-- 
    15             主键配置:oid:object 对象的编号 
    16             name:实体类里面属性的名称;
    17             column:数据库表里面的列:不写表示和实体类属性名一致!
    18         -->
    19         <id name="deptno" column="deptno">
    20             <!--
    21                  生成器:
    22                 主键的生成策略:通过class设定:
    23                     assign:由程序指定主键值!
    24                     foreign:由外键生成!
    25                     identity:标识列!sqlserver支持!
    26                     sequence:序列,oracle,db2,!
    27                     increment:自增,mysql!
    28                     native:由数据库自己决定以上哪种方式!
    29              -->
    30             <generator class="sequence">
    31                 <!-- 指定序列名 -->
    32                 <param name="sequence">seq_index</param>
    33             </generator>
    34         </id>
    35         <!-- 
    36             性质:
    37             type:属性的类型,可以是java类型(要写完全限定名),也可以是hibernate类型!可以省略
    38             column:可以单独写成子节点!
    39          -->
    40         <property name="deptname" column="deptname" type="java.lang.String" />
    41         <property name="loc" column="loc" type="java.lang.String"/>
    42     </class>
    43 </hibernate-mapping>
    hbm映射文件

      cfg指定数据库配置文件:

        

     1 <!DOCTYPE hibernate-configuration PUBLIC
     2     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     3     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     4 
     5 <hibernate-configuration>
     6     <session-factory>
     7         
     8         <!-- 指定oracle对应得dialect -->
     9         <property name="dialect">
    10             org.hibernate.dialect.Oracle10gDialect
    11         </property>
    12         <!-- 数据库jdbc驱动 -->
    13         <property name="connection.driver_class">
    14             oracle.jdbc.driver.OracleDriver
    15         </property>
    16         
    17         <!-- 数据库url -->
    18         <property name="connection.url">
    19             jdbc:oracle:thin:@localhost:1521:XE
    20         </property>
    21         
    22         <!-- 用户名 -->
    23         <property name="connection.username">user_admin</property>
    24         <!-- 用户密码 -->
    25         <property name="connection.password">abc123</property>
    26         
    27         <!-- session范围和上下文 -->
    28         <property name="current_session_context_class">thread</property>
    29         <!-- 是否在运行期间生成的SQL输出到日志以供调试 -->
    30         <property name="show_sql">true</property>
    31         <!-- 是否格式化sql -->
    32         <property name="format_sql">true</property>
    33         <!-- 映射 -->
    34         <mapping resource="cn/cy/Hibernate/entity/Dept.hbm.xml" />
    35     </session-factory>
    36 </hibernate-configuration>
    hibernate.cfg

      

      我可以自己命名cfg.xml文件吗?

        答案是可以的:

        

    1 //读取指定配置
    2 conf=new Configuration().configure("xxx.cfg.xml");
    3 //读取默认配置hibernate.cfg.xml
    4             conf=new Configuration().configure();

        

  • 相关阅读:
    YII 数据插入 save() 方法
    springboot md5 加密
    yii 在model中实现连表查询
    yii 获取登录用户的信息
    yii 在GridView中怎样添加html代码
    yii 返回json数据
    Qt 错误:QMainWindow: No such file or directory 解决方法
    Qt 错误:QtGui/QApplication在Qt5没有这个文件
    VMware Ubuntu 虚拟机安装 VMwareTools (VMware虚拟机如何与主机互相复制文件)
    VMware15、Ubuntu19.04、安装教程(图文步骤)
  • 原文地址:https://www.cnblogs.com/gcs1995/p/4126876.html
Copyright © 2020-2023  润新知