zoukankan      html  css  js  c++  java
  • NHibernate说探——添加,更新,删除

    增改删

    ·不再以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);

            }

     

  • 相关阅读:
    OpenCV---在图片上加入文字
    DosBox 报错 this program requires dosxnt.exe to be in your path
    iOS开发-UITableView单选多选/复选实现1
    LeetCode第七题,Reverse Integer
    【PostgreSQL】PostgreSQL操作-psql基本命令
    Bootstrap的js插件之弹出框(popover)
    Qt Quick 图像处理实例之美图秀秀(附源代码下载)
    【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用
    用Visual Studio高版本号打开低版本号的project,转换时出现错误:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    如何安装ArchLinux
  • 原文地址:https://www.cnblogs.com/jams742003/p/1627072.html
Copyright © 2011-2022 走看看