NHibernate系列文章七:NHibernate对象状态
摘要
- NHibernate对象持久化
- NHibernate对象的三个状态:临时态、持久态、游离态(托管态)
- NHibernate三状态的相互转化
1. NHibernate对象持久化
NHibernate的对象持久化是指将NHibernate的POCO对象写入到持久化对象集合,POCO对象变成持久化状态,以及从数据库中用NHibernate查询出POCO对象,写入到持久化对象集合,查询出的POCO对象具有持久化状态的过程。
NHibernate用XML映射的实体对象类符合POCO(简单传统CLR对象)模型。
POCO模型类定义应具有以下三个特点:
- 不继承于除Object以外任何类
- 不继承任何接口
- 不具有任何Attribute修饰
NHibernate都是自动管理对象的状态和状态的变化的,但是理解他的状态和状态变化有助于我们更深刻的理解NHibernate其他方面(二级缓存、并发控制)。
2. NHibernate对象的三个状态
- 临时态:使用new创建的临时NHibernate实体对象的状态是临时态
- 持久化态:使用NHibernate查询出的实体对象的状态是持久态,具有持久态的对象的主键对应的属性值不为空。持久化态对象被Session进行管理。
- 临时态的对象,如果在持久化对象集合里不存在,经过session.Save方法变成持久态,写入持久化对象集合,并将新对象写入数据库
- 临时态的对象,如果在持久化对象集合里存在,经过session.SaveOrUpdate变成持久态,修改持久化对象集合中的对象,并将修改写入数据库
- 游离态:处于持久化状态的对象,如果session关闭,或者调用了session.Clear方法或session.Evict方法,将对象置于游离态。处于游离态的对象如果再次被session.SaveUpdate或session.Save,重新变回持久态
其他变化:
- 处于持久化状态和游离状态的对象,调用session.Delete方法,都将状态变成临时态
- 处于临时态的对象和游离态的对象,都被.net垃圾回收机制GC进行管理,在必要的时候进行垃圾回收
3. 代码演示
修改Main函数
static void Main(string[] args)
{
var session = SessionFactory.OpenSession();
bool contains = false;
//临时态
Customer customer = CreateCustomer();
contains = session.Contains(customer); //持久化状态的对象被session管理
Console.WriteLine("Is Persistent:{0}", contains); //临时态 -> 持久态
session.Save(customer);
contains = session.Contains(customer);
Console.WriteLine("Is Persistent:{0}", contains); //持久态 -> 游离态
session.Evict(customer); //或 session.Clear();
contains = session.Contains(customer);
Console.WriteLine("Is Persistent:{0}", contains); //游离态 -> 持久态
customer.LastName = "Chen";
session.SaveOrUpdate(customer);
session.Flush(); //将修改马上写入数据库
contains = session.Contains(customer);
Console.WriteLine("Is Persistent:{0}", contains); //持久态 -> 临时态
session.Delete(customer);
session.Flush(); //将修改马上写入数据库
contains = session.Contains(customer);
Console.WriteLine("Is Persistent:{0}", contains); Console.ReadLine();
}
整个添加、修改和删除过程都用同一个session进行,演示了整个session管理对象状态的过程。
如果对象是持久态,则调用session.Contains(object)方法返回true,否则(临时态或游离态)返回false。
修改hibernate.cfg.xml文件,将show_sql属性注释掉,去掉生成的sql语句的干扰。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.connection_string_name">default</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<!--<property name="show_sql">true</property>-->
<mapping assembly="NHibernateDemoApp"/>
</session-factory>
</hibernate-configuration>
清空数据库表Customer后,运行该程序得到结果
- 使用关键字new创建新Customer对象后,该Customer对象为临时态
- 调用session.Save方法后写入数据库,该Customer对象变为持久态
- 关闭session后,该Customer对象没有Session进行托管了,状态变成游离态
- 修改Customer对象属性后,调用session.SaveOrUpdate将修改写入数据库,状态由游离态变回持久态
- 删除Customer对象后,从持久化对象集合里删除了该对象,状态变成了临时态
NHibernate系列文章七:NHibernate对象状态的更多相关文章
- Spring Boot 2.0系列文章(七):SpringApplication 深入探索
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/30/springboot_SpringApplication/ 前言 在 Spring B ...
- NHibernate系列文章九:NHibernate对象二级缓存上
摘要 NHibernate的二级缓存由SessionFactory管理,由所有Session共享. NHibernate缓存读取顺序: 首先从一级缓存中读取,如果一级缓存对象存在,则读取一级缓存对象并 ...
- NHibernate系列文章十:NHibernate对象二级缓存下
摘要 上一节对NHibernate二级缓存做了简单介绍,NHibernate二级缓存是由SessionFactory管理的,所有Session共享.这一节介绍二级缓存其他两个方面:二级缓存查询和二级缓 ...
- NHibernate系列文章一:NHibernate介绍
摘要 NHibernate是一个成熟的开源的面向对象的.net映射框架.大量的实际项目中正在使用该框架.他是建立在ADO.Net基础之上.目前的版本是NHibernate 4.0.4.本系列文章都是基 ...
- NHibernate系列文章十七:NHibernate Session管理(附程序下载)
摘要 NHibernate的Session的管理涉及到NHibernate的两个最重要的对象ISessionFactory和ISession.ISessionFactory的生成非常消耗资源,通常都在 ...
- NHibernate系列文章目录
第一章:NHibernate基础 NHibernate介绍 第一个NHibernate工程 简单的增删改查询 运行时监控 NHibernate配置 数据类型映射 Get/Load方法 NHiberna ...
- NHibernate系列文章二十七:NHibernate Mapping之Fluent Mapping基础(附程序下载)
摘要 从这一节起,介绍NHibernate Mapping的内容.前面文章都是使用的NHibernate XML Mapping.NHibernate XML Mapping是NHibernate最早 ...
- NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)
摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...
- NHibernate系列文章十一:NHibernate并发控制
摘要 在同一时刻数据访问量和更新次数比较大的系统中,产生了数据的并发访问问题.并发访问使得在这样的环境中,所有用户(程序.实际用户.进程.线程等)的操作不产生负面问题. 如果不使用并发,在两个用户同时 ...
随机推荐
- CSS简单布局总结
display block 块级元素,占据一行 none 隐藏 inline 允许同一行显示,但不再有宽和高 inline-block 允许在一行的块级元素,可 ...
- 官网服务质量检测脚本(源码来自《Python自动化运维实战》第二版刘天斯)
脚本Python版本2.7 #!/usr/bin/python #-*- coding:utf-8 -*- import os,sys import time import sys import py ...
- 限制文本框只能输入数字或浮点数的JS脚步
1.oninput,onpropertychange,onchange的用法 l onchange触发事件必须满足两个条件: a)当前对象属性改变,并且是由键盘或鼠标事件激发的(脚本 ...
- HDU 2277 Change the ball
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2277 Change the ball Time Limit: 2000/1000 MS (Java/O ...
- (MST) HDOJ 1102 Constructing Roads
怎么说呢 这题就是个模板题 但是 hud你妹夫啊说好的只有一组数据呢??? 嗯??? wa到家都不认识了好吗 #include <cstdio> #include <cstring& ...
- ps颜色模式
HSB(hue.saturation.bright) 基于人眼 RGB 基于光 CMYK 基于色 LAB 基于大自然颜色库(理论)
- JVM byte code
http://blog.jamesdbloom.com/JVMInternals.html#constant_pool http://grepcode.com/file/repository.grep ...
- php微信接口实例
<?php /** * wechat php test */ //define your token //定义TOKEN秘钥 define("TOKEN", "we ...
- C++编程命名规则(转载)
原文地址:http://www.cnblogs.com/ggjucheng/archive/2011/12/15/2289291.html 如果想要有效的管理一个稍微复杂一点的体系,针对其中事物的一套 ...
- 黄聪:MySQL 按指定字段自定义列表排序
问题描述 大家都知道, MySQL 中按某字段升序排列的 SQL 为 (以 id 为例, 下同): SELECT * FROM `MyTable` , , , ) ORDER BY `id` ASC ...