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(对象)先发起一条查询语句,在发起更新或者插入语句
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 对象的三种状态的更多相关文章
- hibernate对象的三种状态
对于hibernate,我想不在这里讲解了,我们就直接进入主题 在这里我将要说的是"hibernate对象的三种状态",对象是我们十分熟悉的,对吧!而对于对象它有三种状态 分别是瞬 ...
- 菜鸟学SSH(八)——Hibernate对象的三种状态
前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...
- HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口
1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...
- hibernate操纵数据库常用方法 及 hibernate对象的三种状态
在dao层使用hibernate语言来与数据库进行访问,hibernate作为面向对象思想开发的dao层框架其理解也需要以面向对象的思想来看待 使用.hibernate不仅支持使用者使用他提供的对象来 ...
- Hibernate对象的三种状态,瞬时态、持久态、游离态
1.瞬时态.(new完一个对象,突然断电,内存中没有此对象) hibernate中什么时候的对象为瞬时态呢,当我们new 一个对象时,还没有save时,它就是瞬时态的,当我们delete一个对象时,它 ...
- hibernate对象的三种状态及转换
一.hibernate对象三种状态 Transient(瞬时状态):没有session管理,同时数据库没有对应记录 举例:new 出来的对象还没有被session管理,此时该对象处于Transient ...
- [转]Hibernate对象的三种状态
在Hibernate中,对象有三种状态:临 时状态(Transient).持久状态(Persistent)和游离状态(Detached). 处于持久态的对象也称为 PO(PersistenceObje ...
- 分享知识-快乐自己:Hibernate对象的三种状态
图解: 1):瞬时状态(Transient) 对象与session没有关联,数据库中没有对应的数据. 一般new出来的对象便是瞬时对象. 对瞬时对象使用save()方法便使之成为持久对象. 由于数据库 ...
- Hibernate(六)__对象的三种状态
瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象. 持久(persistent):数据库中有数据与之对应,当前 ...
随机推荐
- linux下的module_param()解释【转】
转自:http://blog.csdn.net/wavemcu/article/details/7762133 版权声明:本文为博主原创文章,未经博主允许不得转载. ***************** ...
- WinCE Show App Icon
找个图片,例如背景透明的jpg或png,上http://www.pic2icon.com/smartphone_wince_icon_generator.php这个网站转换下. 在项目属性中,设为图标 ...
- Mac系统之----教你怎么显示隐藏文件,或者关闭显示隐藏文件
缺省情况下,在 Mac 下是不显示隐藏文件的,Finder 也未提供设置是否显示隐藏文件的选项,不像 Windows 下,有一个“文件夹选项“设置界面里可以控制,但这并不表示 Mac 下无法显示隐藏文 ...
- PHP中判断字符串是否含有中文
<?php /** * [1.测试一] * 当$str = '中文测试'; 时输出"全部是汉字";当$str = '中a文3测试'; 时输出"不全是汉字" ...
- 收藏本网站兼容火狐IE
<script type="text/javascript"> function AddFavorite(sURL, sTitle) {try { window.ext ...
- 20145227 《Java程序设计》第7周学习总结
20145227 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 Lambda 如果使用JDK8的话,可以使用Lambda特性去除重复的信息. 在只有Lambda表达式的情 ...
- 获取SqlServer2005表结构(字段,主键,外键,递增,描述)
1.获取表的基本字段属性 --获取SqlServer中表结构 SELECT syscolumns.name,systypes.name,syscolumns.isnullable, syscolumn ...
- Andriod 按钮代码
package com.example.test1; import android.support.v7.app.ActionBarActivity; import android.os.Bundle ...
- SharePoint API测试系列——Records.BypassLocks测试
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 对于SharePoint中已经是Record的Item,我们想要修改他的属性,这在UI界面是无法完 ...
- 编写一个JAVA小程序取得IP地址
在TCP/IP 互联网时,经常会需要查询自己主机的IP地址和www服务器的IP地址.虽然,我们可以使用IPCONFIG 和PING 进行IP地址查询,但是如果在应用程序或APPLET中使用此命令会破坏 ...