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. win10 python nltk安装

    主要是参照http://www.tuicool.com/articles/VFf6Bza

  2. maven在windows环境下加载settings.xml文件

    今天发现maven在windows环境下加载的settings.xml文件是c:下的,就算修改conf下的settings.xml里的<localRepository>给他明确指向也没用.

  3. Apache2.2 + php-5.4.45-Win32-VC9-x86 配置

    首先要注意一个问题是:网上有很多教程比如: 在Apache配置文件中添加php模块.在apache2\conf\httpd.conf中: LoadModule模块添加行: LoadModule php ...

  4. html+css复习之第2篇 | javascript

    1. java 中定义数组和对象: 数组(Array)字面量 定义一个数组: [40, 100, 1, 5, 25, 10] 对象(Object)字面量 定义一个对象: {firstName:&quo ...

  5. java 模拟消息的发送功能

    import java.util.HashMap; import java.util.Iterator; import java.util.Map; /* * 完成消息的发送功能 * 在发送消息之前, ...

  6. java 判断某一天是当年的哪一天

    题目:输入年份,月份,日,判断这一天是这一年的第几天?(闰年的2月份为29天,平年为28天) public class Runnian { /** * 能被4整除且不能被100整除或者能被400整除的 ...

  7. Browser对象

    Window对象即浏览器中打开的窗口,当文档里面有框架(frame或者iframe标签)时,浏览器会为HTML文档创建一个window对象,并为每个框架创建一个额外的window对象. 属性close ...

  8. Coco2dx 3D例子

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18     // add "HelloWorld" splash screen"   ...

  9. quick lua目录结构

    http://cn.cocos2d-x.org/tutorial/show?id=1138 http://cn.cocos2d-x.org/tutorial/show?id=2385

  10. Animator组件关闭再打开后参数丢失问题

    问题如下,因为再激活Animator时,它会重置一次,参数也会丢失 这个问题一直存在,论坛给出的解释是把参数缓存下来,在激活时重置 http://answers.unity3d.com/questio ...