NHibernate说探——添加,更新,删除

简介: 增改删 ·不再以Northwind为例子,现提供测试数据库Customer 现有数据: CustomerID FirstName     LastName   ·持久类 public class Customer     {         public virtual int Un...

增改删

·不再以Northwind为例子,现提供测试数据库Customer

现有数据:

CustomerID FirstName     LastName

 

·持久类

public class Customer

    {

        public virtual int Unid { get; set; }

        public virtual string FirstName { get; set; }

        public virtual string LastName { get; set; }

    }

·映射

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Entities">

  <class name="Customer" table="customer">

    <id name="Unid" column="customerid">

      <generator class="native"></generator>

    </id>

    <property name="FirstName" column="firstname"></property>

    <property name="LastName" column="lastname"></property>

  </class>

</hibernate-mapping>

 

(一)  增(Add

添加一个客户

public void AddCustomer(Customer customer)

        {

            using (ITransaction trans = _session.BeginTransaction())

            {

                try

                {

                    object obj= _session.Save(customer);

                    trans.Commit();

                    Console.WriteLine(obj.ToString());

                }

                catch

                {

                    trans.Rollback();

                    throw;

                }

            }

        }

映射文件中主键生成策略用的是native这个字段的意思:

根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

主键生成类型包括:

·identity使用SQL Server MySQL 的自增字段,由数据库返回,返回类型为intmssql数据库常用的就是这个)

·guid System.Guid实例作为标示符,全名Globally Unique Identifier,全球唯一标识符,格式为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,这个也是在mssql中常用的

·uuid.hex用一个System.GuidToString()方法法生成字符串类型的标识符,字符串的长度由format参数定义。[ Hibernate 基于128 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)]

·uuid.string 用一个新的System.Guid实例的byte[]转化为字符串作为标示符。

·guid.comb 使用Jimmy Nilsson的算法。GUID也叫UUID,这样的话以上几种uuid.hexuuid.string就好理解

·increment用于为int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。即插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法

·sequenceDB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence) 而在Interbase中使用生成器(generator)。返回的标识符是int类型的。要设定序列名,不然hibernate无法找到:<param   name="sequence">NAME_SEQ</param>

·hilo 使用一个高/低位算法来高效的生成int类型的标识符。给定一个表和字段(默认分别是是hibernate_unique_key next_hi)作为高位值得来源。 /低位算法生成的标识符只在一个特定的数据库中是唯一的。在用户自行提供的连接中,不要使用这种生成器。

·seqhilo 使用一个高/低位算法来高效的生成int类型的标识符,给定一个数据库序列(sequence)的名字。

·assigned 让应用程序在 Save()之前为对象分配一个标示符。即由程序控制生成标识。Hibernate不参与。

·native 根据底层数据库的能力选择identity, sequence 或者hilo中的一个。对于 oracle 采用 Sequence 方式,对于MySQL SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不参与管理。

 

1)现在使用identity,效果和现在的native相同,IsessionSave将返回生成的标识。

2)现在使用Guid,数据库表Customer先不改动,还是identity类型的标识。

当使用guid时,

·数据库标识类型,映射类型,持久类型须一致。

·映射文件中guid区分大小写,须为guid

3)现在使用uuid.hex,持久标识类型为string,且数据库标识字段为字符串。

4)再使用一下:assigned,此策略是由程序控制生成唯一标识。这种策略比较灵活,标识类型可以有多种选择,使用这种策略时,添加对象时,应对标识赋值

5)其它几种不再介绍

(二)删除

把主键策略调为indentity

public void DeleteCustomer(Customer customer)

        {

            using (ITransaction trans = _session.BeginTransaction())

            {

                try

                {

                    _session.Delete(customer);

                    trans.Commit();

                }

                catch

                {

                    trans.Rollback();

                    throw;

                }

            }

        }

这里直接删除customer实例。使用ISession.Delete() 会把对象的状态从数据库中移除。当然,你的应用程序可能仍然持有一个指向它的引用。所以,最好这样理解: Delete()的用途是把一个持久化实例变成临时实例。

Delete方法有很多重载,其中就有一个可以添加hibernate查询字符串,用于删除多条记录(这个是容易理解的,查询的内容为实例列表,单实例删除一个实例,列表删除很容易)。删除记录可以不管外键约束,但可能引发外键字段定义的NOT NULL约束冲突。(关于这个外键约束删除在以后说明)

(三)  更新

事务中的持久化实例(就是通过ISession装载、保存、创建或者查询出的对象)可以被程序操作,所做的任何修改都会在ISession同步(flushed)的时候被持久化。

public void UpdateCustomer(Customer customer)

        {

            using (ITransaction trans = _session.BeginTransaction())

            {

                try

                {

                    _session.Update(customer);

                    _session.Flush();

                    trans.Commit();

                }

                catch

                {

                    trans.Rollback();

                    throw;

                }

            }

        }

 

        public Customer GetCustomerById(int iId)

        {

            return _session.Get<Customer>(iId);

        }

        测试更新:

[Test]

        public void TestUpdate()

        {

            //load,持久

            Customer customer = hh.GetCustomerById(3);

 

            //修改

            customer.FirstName = "Jimmy";

 

            //更新

            hh.UpdateCustomer(customer);

        }

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
C# 开发者 Windows
WPF与PDF文档:解锁创建和编辑PDF文件的新技能——从环境配置到代码实践,手把手教你如何在WPF应用中高效处理PDF,提升文档管理效率
【8月更文挑战第31天】随着数字文档的普及,PDF因跨平台兼容性和高保真度成为重要格式。WPF虽不直接支持PDF处理,但借助第三方库(如iTextSharp)可在WPF应用中实现PDF的创建与编辑。本文通过具体案例和示例代码,详细介绍了如何在WPF中集成PDF库,并展示了从设计用户界面到实现PDF创建与编辑的完整流程。不仅包括创建新文档的基本步骤,还涉及在现有PDF中添加页眉页脚等高级功能。通过这些示例,WPF开发者可以更好地掌握PDF处理技术,提升应用程序的功能性和实用性。
671 0
|
Prometheus Kubernetes 监控
在K8S中,Pod占用内存和cpu较高,该如何解决?
在K8S中,Pod占用内存和cpu较高,该如何解决?
成功解决:Failed to load resource: net::ERR_FILE_NOT_FOUND
这篇文章提供了解决"Failed to load resource: net::ERR_FILE_NOT_FOUND"错误的步骤,通过修改配置文件中的资源路径设置为相对路径"./"来成功运行打包后的项目。
成功解决:Failed to load resource: net::ERR_FILE_NOT_FOUND
|
JavaScript
Vue3 + Vite + TS项目引入iconfont图标(Svg方式)
前言 每一个项目都避免不了使用各种各样的图标,如果我们使用了 UI 组件库,比如说 ELement 等,那么组件库有一些封装好的图标供我们使用。但是项目是多变的和复杂的,组件库提供的图标很多时候不能满足需求,这个时候就需要我们自己引入想要的图标了。 今天介绍的便是如何将 iconfont 阿里图标库的图标引入到我们的 Vue3 项目中来!
5728 1
Vue3 + Vite + TS项目引入iconfont图标(Svg方式)
|
物联网 Linux 开发工具
MQTT协议接入问题之连接失败如何解决
MQTT接入是指将设备或应用通过MQTT协议接入到消息服务器,以实现数据的发布和订阅;本合集着眼于MQTT接入的流程、配置指导以及常见接入问题的解决方法,帮助用户实现稳定可靠的消息交换。
1119 2
|
SQL 存储 关系型数据库
OushuDB 创建和管理表的基本结构之表的基本概念
关系型数据库中的表非常类似纸面上的一张表:它由行和列组成。列的数目和顺序是固定的,每个列都有一个名字。行的数目是变化的(它反映了给定时刻存储的数据量)。SQL 对表中行的顺序没有任何规定。当读取一个表时,行将会以一个随机的顺序出现,除非你明确地要求排序。另外,SQL 并不给行赋予唯一的标识,因此我们很可能在一个表中有好几个完全相同的行。这是作为 SQL 基础的下层数学模型的必然结果,但是这通常是我们不愿意看到的。
160 0
OushuDB 创建和管理表的基本结构之表的基本概念
|
Linux 数据安全/隐私保护 网络协议
|
关系型数据库 MySQL SQL
MySQL 仅保留7天、一个月数据
/************************************************************************** * MySQL 仅保留7天、一个月数据 * 说明: * 嵌入式产品作为数据才采集的终端,其数据一般不会保留太多、太长时间,一 * 般来说都是保留最近7天、一个月的数据就够了,主要是考虑到存储空间的问题, * 本文记录一下MySQL的日期建表方式和数据查询方面的SQL语句。
1745 0
|
6天前
|
弹性计算 人工智能 安全
云上十五年——「弹性计算十五周年」系列客户故事(第二期)
阿里云弹性计算十五年深耕,以第九代ECS g9i实例引领算力革新。携手海尔三翼鸟、小鹏汽车、微帧科技等企业,实现性能跃升与成本优化,赋能AI、物联网、智能驾驶等前沿场景,共绘云端增长新图景。