NHibernate学习手记(2) - NH的系统架构

本文探讨了.NET项目中数据库编程方式的演变,从直接调用存储过程到使用NHibernate(NH)进行对象关系映射(O/R Mapping)。介绍了NH的系统架构,包括其持久层功能和服务形式,以及如何通过Session与应用程序交互,实现数据的高效存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hibernate的名气实在太大,甚至已经成为Java社区的持久层技术的事实标准!作为Hibernate的孪生兄弟,NH从一诞生便是头顶光环,难免会给我们这些NH beginner造成或多或少的心理压力,这也可能是为什么.net项目组迟迟不引入O/R mapping的的原因之一。

本文中并不打算评价O/R Mapping到底有什么好处,因为这个话题实在已经过时了。从Java社区对Hibernate等O/R Mapping框架的应用,可以看出业界已经普遍认同O/R Mapping能够帮助我们以OO的方式进行数据库编程,实现更为高效和优雅的开发方式。随着.net社区的逐渐成熟,NH一定会得到更广泛的应用。

主要内容

1、数据库编程方式的进化

2、NH的系统架构

 

一、数据库编程方式的进化

在开始介绍NH的系统架构之前,先谈谈我所经历的.net项目组进行数据库编程的方式的变化:

过去:主要是调用存储过程,对于比较简单的数据库操作也可直接编写简单的sql语句。

现在:由于存储过程难以维护,所以建议尽量采取执行sql语句的方式进行数据库操作。同时,为了让大家更加容易的执行sql语句,还总结出了DAAB之类的数据库操作辅助包。

下一步:随着系统的不断增大,之前大量采用sql实现业务逻辑的设计和编码的做法会加大我们项目的维护的难度和成本。而且采取上述方式进行数据库开发的效率非常低,开发人员往往花费大量时间在和数据库打交道,更谈不上thinking in OO。数据库编程转向O/R mapping。

二、NH的系统架构

在继续阅读之前,如果你想先体验一下NH的便利和优雅,可以参考一下我之前发的NHibernate学习手记(1) - 对象的简单CRUD操作

1、术语解释

1)持久化(persistent)和持久化对象(persitent object):在程序运行时创建的对象,并要求保存到数据库、文件等存储介质中。如订单、人员信息等。

2、NH的持久层功能示意


Application即任何需要持久化服务(即数据存储)的应用程序。NH的持久化功能是以服务形式提供的,实现应用程序代码和数据库操作之间的解偶。当然,为了能够使用NH,我们必须要进行一些配置工作。

3、NH系统架构简图


上图传达了NH进行持久化的简单思想。在应用程序(Application)中创建的临时对象(Transient objects),开始是保存在内存中的;接着应用程序和NH进行对话(Session,事先需要先由SessionFactory创建Session),告知NH需要进行的持久化请求;NH根据配置文件把持久化操作转化为相应的数据库操作,调用相应的ADO.Net API执行数据库操作。

4、NH系统架构全景图

下图揭示了NH更多的技术细节,我将在后续的文章中,继续介绍。

 

### 使用Transformer模型进行图像分类的方法 #### 方法概述 为了使Transformer能够应用于图像分类任务,一种有效的方式是将图像分割成固定大小的小块(patches),这些小块被线性映射为向量,并加上位置编码以保留空间信息[^2]。 #### 数据预处理 在准备输入数据的过程中,原始图片会被切分成多个不重叠的patch。假设一张尺寸为\(H \times W\)的RGB图像是要处理的对象,则可以按照设定好的宽度和高度参数来划分该图像。例如,对于分辨率为\(224\times 224\)像素的图像,如果选择每边切成16个部分的话,那么最终会得到\((224/16)^2=196\)个小方格作为单独的特征表示单元。之后,每一个这样的补丁都会通过一个简单的全连接层转换成为维度固定的嵌入向量。 ```python import torch from torchvision import transforms def preprocess_image(image_path, patch_size=16): transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), # 假设目标分辨率是224x224 transforms.ToTensor(), ]) image = Image.open(image_path).convert('RGB') tensor = transform(image) patches = [] for i in range(tensor.shape[-2] // patch_size): # 高度方向上的循环 row_patches = [] for j in range(tensor.shape[-1] // patch_size): # 宽度方向上的循环 patch = tensor[:, :, i*patch_size:(i+1)*patch_size, j*patch_size:(j+1)*patch_size].flatten() row_patches.append(patch) patches.extend(row_patches) return torch.stack(patches) ``` #### 构建Transformer架构 构建Vision Transformer (ViT),通常包括以下几个组成部分: - **Patch Embedding Layer**: 将每个图像块转化为低维向量; - **Positional Encoding Layer**: 添加绝对或相对位置信息给上述获得的向量序列; - **Multiple Layers of Self-Attention and Feed Forward Networks**: 多层自注意机制与前馈神经网络交替堆叠而成的核心模块; 最后,在顶层附加一个全局平均池化层(Global Average Pooling)以及一个多类别Softmax回归器用于预测类标签。 ```python class VisionTransformer(nn.Module): def __init__(self, num_classes=1000, embed_dim=768, depth=12, num_heads=12, mlp_ratio=4., qkv_bias=False, drop_rate=0.): super().__init__() self.patch_embed = PatchEmbed(embed_dim=embed_dim) self.pos_embed = nn.Parameter(torch.zeros(1, self.patch_embed.num_patches + 1, embed_dim)) self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim)) dpr = [drop_rate for _ in range(depth)] self.blocks = nn.Sequential(*[ Block( dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, drop=dpr[i], ) for i in range(depth)]) self.norm = nn.LayerNorm(embed_dim) self.head = nn.Linear(embed_dim, num_classes) def forward(self, x): B = x.shape[0] cls_tokens = self.cls_token.expand(B, -1, -1) x = self.patch_embed(x) x = torch.cat((cls_tokens, x), dim=1) x += self.pos_embed x = self.blocks(x) x = self.norm(x) return self.head(x[:, 0]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值