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(对象)先发起一条查询语句,在发起更新或者插入语句

     public static boolean addDept(){
boolean flag=false;
Configuration conf=null;
SessionFactory factory=null;
Session session=null;
Transaction trans=null;
try {
//读取配置文件
//指定配置文件
//conf=new Configuration().configure("xxx.cfg.xml");
conf=new Configuration().configure();
//创建sessionfactory
factory=conf.buildSessionFactory();
//打开会话
session=factory.openSession();
//开启事务
trans=session.beginTransaction(); Dept dept=(Dept)session.get(Dept.class, 8);
//当设置了gennerator为sequence时,不给参数是以指定sequence填值
//dept.setDeptno(10);
dept.setDeptname("test测试部");
dept.setLoc("xz");
//持久化
//session.save(dept);
//session.delete(dept);
//Dept dp=(Dept)session.get(Dept.class, 1);//没有数据,返回空值
//System.out.println(dp.getDeptname());
//延迟加载
//Dept dp=(Dept)session.load(Dept.class, 5);//没有数据,报异常
//保存或更新
session.saveOrUpdate(dept);
//合并
//session.merge(dept);
//提交事务
trans.commit(); flag=true;
} catch (Exception e) {
e.printStackTrace();
trans.rollback();
}finally{
if(session!=null){
session.close(); }
}

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类型!可以省略

    示例:

    

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 类和表 属性和字段的关系 -->
<!-- <hibernate-mapping package="cn.cy.Hibernate.entity"> -->
<hibernate-mapping>
<!-- 与关键字冲突 ”~~“解决 -->
<!-- 通常一个mapping只写一个class节点 -->
<!-- 类名和表名可以不一样! -->
<class name="cn.cy.Hibernate.entity.Dept" table="dept" dynamic-update="true">
<!-- <class name="Dept" table="dept"> -->
<!-- 当数据库里面的列明与java属性一致时,我们可以省略colnumn -->
<!--
主键配置:oid:object 对象的编号
name:实体类里面属性的名称;
column:数据库表里面的列:不写表示和实体类属性名一致!
-->
<id name="deptno" column="deptno">
<!--
生成器:
主键的生成策略:通过class设定:
assign:由程序指定主键值!
foreign:由外键生成!
identity:标识列!sqlserver支持!
sequence:序列,oracle,db2,!
increment:自增,mysql!
native:由数据库自己决定以上哪种方式!
-->
<generator class="sequence">
<!-- 指定序列名 -->
<param name="sequence">seq_index</param>
</generator>
</id>
<!--
性质:
type:属性的类型,可以是java类型(要写完全限定名),也可以是hibernate类型!可以省略
column:可以单独写成子节点!
-->
<property name="deptname" column="deptname" type="java.lang.String" />
<property name="loc" column="loc" type="java.lang.String"/>
</class>
</hibernate-mapping>

hbm映射文件

  cfg指定数据库配置文件:

    

 <!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory> <!-- 指定oracle对应得dialect -->
<property name="dialect">
org.hibernate.dialect.Oracle10gDialect
</property>
<!-- 数据库jdbc驱动 -->
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property> <!-- 数据库url -->
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:XE
</property> <!-- 用户名 -->
<property name="connection.username">user_admin</property>
<!-- 用户密码 -->
<property name="connection.password">abc123</property> <!-- session范围和上下文 -->
<property name="current_session_context_class">thread</property>
<!-- 是否在运行期间生成的SQL输出到日志以供调试 -->
<property name="show_sql">true</property>
<!-- 是否格式化sql -->
<property name="format_sql">true</property>
<!-- 映射 -->
<mapping resource="cn/cy/Hibernate/entity/Dept.hbm.xml" />
</session-factory>
</hibernate-configuration>

hibernate.cfg

  

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

    答案是可以的:

    

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

    

Hibernate 对象的三种状态的更多相关文章

  1. hibernate对象的三种状态

    对于hibernate,我想不在这里讲解了,我们就直接进入主题 在这里我将要说的是"hibernate对象的三种状态",对象是我们十分熟悉的,对吧!而对于对象它有三种状态 分别是瞬 ...

  2. 菜鸟学SSH(八)——Hibernate对象的三种状态

    前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...

  3. HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口

    1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...

  4. hibernate操纵数据库常用方法 及 hibernate对象的三种状态

    在dao层使用hibernate语言来与数据库进行访问,hibernate作为面向对象思想开发的dao层框架其理解也需要以面向对象的思想来看待 使用.hibernate不仅支持使用者使用他提供的对象来 ...

  5. Hibernate对象的三种状态,瞬时态、持久态、游离态

    1.瞬时态.(new完一个对象,突然断电,内存中没有此对象) hibernate中什么时候的对象为瞬时态呢,当我们new 一个对象时,还没有save时,它就是瞬时态的,当我们delete一个对象时,它 ...

  6. hibernate对象的三种状态及转换

    一.hibernate对象三种状态 Transient(瞬时状态):没有session管理,同时数据库没有对应记录 举例:new 出来的对象还没有被session管理,此时该对象处于Transient ...

  7. [转]Hibernate对象的三种状态

    在Hibernate中,对象有三种状态:临 时状态(Transient).持久状态(Persistent)和游离状态(Detached). 处于持久态的对象也称为 PO(PersistenceObje ...

  8. 分享知识-快乐自己:Hibernate对象的三种状态

    图解: 1):瞬时状态(Transient) 对象与session没有关联,数据库中没有对应的数据. 一般new出来的对象便是瞬时对象. 对瞬时对象使用save()方法便使之成为持久对象. 由于数据库 ...

  9. Hibernate(六)__对象的三种状态

    瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象. 持久(persistent):数据库中有数据与之对应,当前 ...

随机推荐

  1. Linux workqueue疑问【转】

    转自:http://blog.csdn.net/angle_birds/article/details/9387365 各位大神,你们好.我在使用workqueue的过程中遇到一个问题. 项目采用uC ...

  2. Linux系统调用---同步IO: sync、fsync与fdatasync【转】

    转自:http://blog.csdn.net/cywosp/article/details/8767327 [-] 1  write不够需要fsync 2 fsync的性能问题与fdatasync ...

  3. ARM多核处理器启动过程分析【转】

    转自:http://blog.csdn.net/qianlong4526888/article/details/27695173 版权声明:本文为博主原创文章,未经博主允许不得转载. 说明: 该流程图 ...

  4. Quartz2D简介及基本线条绘制

    * Quartz2D简介 1.什么是Quartz2D? 他是一个二维的绘图引擎,同时支持iOS和Mac系统 2.Quartz2D能完成的工作 画基本线条,绘制文字,图片,截图,自定义UIView. 3 ...

  5. mysql 关联条件与查询(过滤)条件

    mysql用outer join时 on 后边只是关联条件,有时可能会查出无用的记录, 需用where查询条件过滤 五欧诺个的数据. 记录一下

  6. mysql使用索引扫描来做排序

    mysql有两种方式可以生成有序的结果,通过排序操作或者按照索引顺序扫描,如果explain的type列的值为index,则说明mysql使用了索引扫描来做排序(不要和extra列的Using ind ...

  7. java 面试每日一题

    题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? import java.util.Scanner; public cl ...

  8. listview实现点击条目上的箭头展开隐藏菜单。

    效果如下图,当点击listview中的小三角时,显示出下面布局,再点隐藏, 点击其他条目的三角时,上一个展开的条目隐藏的同时展开当前条目. 思路是在item布局中放入展开菜单的布局,并设置状态为隐藏, ...

  9. layer

    一款实用的web提示框架!下面是实用这款框架的实例 html代码 <p class='layer_notice'>我们是否是好惹的</p> <input type=&qu ...

  10. python-django 模型model字段类型说明

    V=models.CharField(max_length=None<, **options>) #varchar V=models.EmailField(<max_length=7 ...