NHibernate配置

 

一、NHibernate基本配置

  NHibernate配置要注意的有:

  1、NHibernate需要一个自定义的配置节点,一般放在Web.config里或App.config里面,当然你可以自己定义实际位置。

  示例如下:

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name ="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate"/> (1)
  </configSections>
  <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
    <session-factory name="Dao">
      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>          (2)
      <property name="connection.connection_string">          
        Data Source=KISSDODOG-PC;Initial Catalog=Test;uid=sa;pwd=123;                       (3)                        
      </property>
      <property name ="dialect">NHibernate.Dialect.MsSql2008Dialect</property>                  (4)
      <mapping assembly ="Model"/>                                            (5)
    </session-factory>    
  </hibernate-configuration>
</configuration>
复制代码

  (1)、声明自定义配置节点

    name:自定义配置节点名称。

    type:处理程序位置。

  (2)、声明是哪一个数据库驱动程序。

  (3)、数据库连接。

  (4)、所使用的SQL方言,通过这个方言,NHibernate才知道要将你写的查询语句,翻译成何种数据库的SQL语句。

  (5)、设定映射文件默认所在的程序集。‘

  NHibernate的配置节点并不止5个,想知道更详细的配置节点说明:http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919873.html

  另外,这一个配置节点文件,并不一定要放在Web.config或App.config里,例如你可以定义一个hibernate.cfg.xml文件,然后创建ISessionFactory时指定位置:

ISessionFactory sessionFactory = new Configuration().Configure(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "hibernate.cfg.xml").BuildSessionFactory();

  这里要小心"new Configuration().Configure()",如果没有Configure("xxx.cfg.xml")就是从配置文件加载,有就是从自定义文件(如:xxx.cfg.xml)加载。

  注意,此hibernate.cfg.xml文件名可以随意起,但是要设置为始终复制。否则将报告如下错误:

  An exception occurred during configuration of persistence layer.

   2、NHibernate的映射文件一定要设为嵌入的资源。

  

  3、NHibernate的实体类所有的属性都要加上virtual-虚属性,具体将在持久化类的文章中说明,下面给个例子:

    public class PersonModel
    {
        public virtual int Id { get; set; }

        public virtual string Name { get; set; }
    }

   NHibernate作为一个ORM框架,它需要知道如何将数据库的表与对应的实体类相关联,NHibernate通过映射文件的方式来获得这方面的信息。

二、获取映射文件相关配置

  NHibernate中的映射文件以hbm.xml为后缀结束,NHibernate获取映射文件的方法有3种方法。

  1、从config程序配置文件获取映射文件位置

  NHibernate运行在.Net程序上,需要自己提供一个自定义配置节点,这个配置节点里面包含了数据库连接,什么数据库等等信息。其中就包括了配置文件所在位置的信息。

  NHibernate会直接从Web.config或App.config文件上的配置节点上读取这个节点,然后从节点指定的程序集去查找映射文件。

  <mapping assembly ="Nx.Repository"/>  

   以上这个配置节点所保存的就是映射文件默认所在的程序集。这样当程序启动时,NHibernate就会自动去Nx.Repository寻找*.hbm.xml映射文件。

  如果NHibernate找不到映射文件,则可能会报如下错误:

“/”应用程序中的服务器错误。


No persister for: xxx.xxx

 

   2、编程的方式,写在代码里

  (1)、AddFile 指定映射文件

  ISessionFactory sessionFactory = new Configuration().Configure().AddFile(@"C:\Users\Administrator\Desktop\NHibernate学习\Model\Mapping\Person.hbm.xml").BuildSessionFactory();

  注意,当你不写全路径的时候,也就是只写个文件名,那么NHibernate就会从配置文件读取程序集,到配置文件中指定的程序集去加载此映射文件。如果配置文件并不指定程序集,那么就从当前程序集中查找指定名的映射文件。但这种方式,不必设置嵌入的资源,但要记得设置为始终复制。

  Configuration cfg = new Configuration().AddFile("Mapping/Person.hbm.xml");
  ISessionFactory sessionFactory = cfg.BuildSessionFactory();

  这种方法只是指定一个文件,但是可以链式指定多个如:AddFile("f1").AddFile("f2")。

  (2)、AddAssembly

  还有另外一种方法,在创建Configuration时指定程序集。

  Configuration cfg = new Configuration().AddAssembly("Model");       //Model为映射文件所在程序集名称
  ISessionFactory sessionFactory = cfg.BuildSessionFactory();

  这种方法,即使.config配置文件里<mapping assembly=""/>节点为空也没关系,NHibernate会自动到指定的程序集里查找所有以.hbm.xml结尾的文件。

  (3)、AddClass

  这种方式,可以消除程序对文件路径字符串的硬编码。

  Configuration cfg = new Configuration().AddClass(typeof(Model.Person));
  ISessionFactory sessionFactory = cfg.BuildSessionFactory();

  但是缺点也非常明显,类名必须与映射文件的名称相同。不然,编译就无法通过,因为Person类都找不到。另外,映射文件Person.hbm.xml必须放在根目录。

  NHibernate会自动到程序中去查找名为Person.hbm.xml文件。

 

三、持久化类中成员标量的要求

  作为被NHibernate使用的持久化类,必须满足以下几点要求:

  1、声明读写属性

    在NHibernate的使用中,持久化类的成员变量必须声明对应的属性,NHibernate支持public、internal、protected三种访问修饰符。

  2、提供标识属性

    持久化类必须提供一个标识属性,标识属性对应数据库的主键。

    当然这个是可选的,并非强制性,但是强烈建议这么做。这个标识属性可以叫任何名字,任何类型。

  3、属性必须是非密封的和虚的

    持久化类中所有的属性,必须声明为非密封的,也就是不能带有sealed。而且必须带有virtual关键字。

  继承持久化的类,如果想作为持久化类,也必须满足以上3点条件。

四、实现ILifecycle接口,实现回调(Callbacks)操作

  持久化类可以实现一个叫ILifecycle的接口,从而实现一些回调方法,比如可以让持久化对象在save、load之后,delete、update之前进行一些初始化或清除的工作。

  注意在实现接口的时候,方法也必须声明为virtual的和public/internal的。

  我们先来看看接口的代码:

复制代码
  public interface ILifecycle
  {                                                                   
        LifecycleVeto OnSave(ISession s);                           
        LifecycleVeto OnUpdate(ISession s);                         
        LifecycleVeto OnDelete(ISession s);                       
        void OnLoad(ISession s, object id);
  }
复制代码

  方法说明:

  OnSave:    对象即将被save或insert时调用。
  OnUpdate: 对象即将被update时调用。
  OnDelete:  对象即将被delete时调用。
  OnLoad:    对象被装载后,第一时间调用。

  示例:

复制代码
    public class PersonModel : ILifecycle
    {
        public virtual int Id
        {
            get;
            set;
        }

        public virtual string Name
        {
            get;
            set;
        }

        public virtual LifecycleVeto OnDelete(NHibernate.ISession s)
        {
            throw new NotImplementedException();
        }

        public virtual void OnLoad(NHibernate.ISession s, object id)
        {
            this.Name = "加载时修改姓名!";
            Console.WriteLine("在加载时调用!");   //在这里可以初始化等操作
        }

        public virtual LifecycleVeto OnSave(NHibernate.ISession s)
        {
            throw new NotImplementedException();
        }

        public virtual LifecycleVeto OnUpdate(NHibernate.ISession s)
        {
            throw new NotImplementedException();
        }
    }
复制代码

  调用代码:

复制代码
        static void Main(string[] args)
        {
            PersonDao dao = new PersonDao();
            PersonModel p = dao.GetPersonById(3);
            Console.WriteLine(p.Id + " " + p.Name);

            Console.ReadKey();
        }
复制代码

  输出结果如下:

  

  如果OnSave(),OnUpdate或OnDelete返回了LifecycleVeto.veto,那么这些操作会被取消了。

五、持久化类实例的状态

  一个持久化类实例,可能处于以下3种状态。这三种状态与ISession实例有关。

  •   瞬态(transient)
  •   持久化(persistent)
  •   脱管(detached)

  1、瞬态

  该持久化实例未与任何ISession实例关联过,没有持久化标识。

  Person p = new Person();

  如上面这个p实例就是瞬态。

  2、持久化

  该持久化实例与ISession有关联,它拥有持久化标识。持久化标识与CLR标识(内存中的位置)等价。通常是指刚刚从数据库里读出来或是刚刚保存入数据库的对象实例。

  ISession session = sessionFactory.OpenSession();
  Person p = session.Get<Person>(Id);

  如上面这个p,就是持久化状态。

  3、脱管

  实例曾经与ISession关联过,但是那个ISession关闭了。它拥有持久化标识,并且可能在数据库有与其对应的一条记录。如果此时,又与ISession关联上,它就转变为了持久化状态。

 ISession session = sessionFactory.OpenSession();
 Person p = session.Get<Person>(Id);
 session.Close();

  在Close()之后,p对象就是脱管状态了。

  4、瞬态-持久化转变

  ISession session = sessionFactory.OpenSession();
  Person p = new Person(10,"张三");      //瞬态
  Console.WriteLine(session.Contains(p)); //输出 false
  session.Save(p);
  Console.WriteLine(session.Contains(p)); //输出true 现在p是持久化状态了

  5、持久化状态-脱管转变

 ISession session = sessionFactory.OpenSession();
 PersonModel p = session.Get<PersonModel>(2);
 Console.WriteLine(session.Contains(p));    //输出 ture 持久化状态
 session.Close();
 Console.WriteLine(sessionFactory.OpenSession().Contains(p));    //输出 false 脱管

   了解持久化状态,对理解NHibernate缓存,离线查询等功能是必要的。

转载于:https://www.cnblogs.com/become/p/6992596.html

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值