初探SchemaExport工具使用

【论文精读】Latent Diffusion Latent Diffusion 阅读详情
本节内容

  引入

  SchemaExport工具

  SchemaUpdate工具

  实例分析

  结语

  引入

  我其实都是一直先编写持久化类和映射文件,然后使用SchemaExport工具生成数据库架构。这样的方式就是领域驱动设计/开发(DDD,Domain Driven Design/Development)。我的理解是系统的设计应该基于对象模型,主要考虑对象的设计和逻辑上,然后按照对象模型建立数据库关系模型,这才是现在面向对象开发的步骤,并不是上一篇先设计数据库然后再设计对象。用一幅图可以形象的说明领域驱动设计:

  

  当在设计时,我们的领域模型需要改变,只需修改NHibernate结构和应用程序,不需要修改数据库架构,只要利用SchemaExport工具重新生成数据库架构就可以了。但是使用数据库只是其中一种方式,我们也可以使用XML文件来存储数据。

  SchemaExport工具

  NHibernate的hbm2dll提供SchemaExport工具:给定一个连接字符串和映射文件,不需输入其他东西就可以按照持久化类和映射文件自动生成数据库架构,现在SchemaExport工具还不是很强大,但是一般应用足够了,它还是一个相当原始的API还在不断改进。

  SchemaExport工具就是把DDL脚本输出到标准输出,同时/或者执行DDL语句。SchemaExport工具提供了三个方法,分别是Drop()、Create()、Execute(),前两个方法实质是调用Execute()方法。通常使用Execute()方法来生成数据库架构的。

  SchemaUpdate工具

  在NHibernate2.0中新添加SchemaUpdate工具,可以用来更新数据库架构。但是我觉得没有什么作用,因为它不能Drop现有的表或列,也不能更新现有的列,只能添加新的表和列。如果我需要删除表或者列或者修改其中列,SchemaUpdate工具就显得无能为力了。

  实例分析

  知道了上面的知识就好好实战一下:看看具体怎么使用呢?

  1.SchemaExport工具实战

  通常我们使用生成数据库架构代码实例像这样:

Configuration cfg=new Configuration();
cfg.Configure();
SchemaExport export =new SchemaExport(cfg);
export.Execute(....);

 1.准备工作

  现在数据访问测试层新建一SchemaExportFixture.cs文件用于测试生成实战。声明一个全局变量_cfg,编写[SetUp]方法在每个测试方法执行之前调用:

[TestFixture]
public class SchemaExportFixture
{
  private Configuration _cfg;
  [SetUp]
  public void SetupContext()
  {
    _cfg = new Configuration();
    _cfg.Configure();
  }
  //测试......
}

  2.测试Drop(script, export)方法

[Test]
public void DropTest()
{
  var export = new SchemaExport(_cfg);
  export.Drop(true, true);
}

  Drop(script, export)方法根据持久类和映射文件执行删除数据库架构。有两个参数,第一个为True就是把DDL语句输出到控制台,第二个为True就是根据持久类和映射文件执行删除数据库架构操作,经过调试可以发现Drop(script, export)方法其实质是执行了Execute(script, export, true, true)方法。

  3.测试Create(script, export)方法

[Test]
public void CreateTest()
{
  var export = new SchemaExport(_cfg);
  export.Create(true, true);
}

  Create(script,export)方法根据持久类和映射文件先删除架构后创建删除数据库架构。有两个参数,第一个为True就是把DDL语句输出到控制台,第二个为True就是根据持久类和映射文件先执行删除再执行创建操作,经过调试可以发现这个方法其实质是执行Execute(script,export, false, true)方法。

  4.测试Execute(script, export, justDrop, format)方法

[Test]
public void ExecuteTest()
{
  var export = new SchemaExport(_cfg);
  export.Execute(true, true, false, false);
}

  Execute(script, export, justDrop, format)方法根据持久类和映射文件先删除架构后创建删除数据库架构。有四个参数,第一个为True就是把DDL语句输出到控制台;第二个为True就是根据持久类和映射文件在数据库中先执行删除再执行创建操作;第三个为false表示不是仅仅执行Drop语句还执行创建操作,这个参数的不同就扩展了上面两个方法;第四个参数为false表示不是格式化输出DDL语句到控制台,是在一行输出的。

所谓格式化输出就像这样:

  

  一行输出就像这样:

  

  5.测试Execute(script, export, justDrop, format, connection, exportOutput)方法

[Test]
public void ExecuteOutTest()
{
  var export = new SchemaExport(_cfg);
  var sb = new StringBuilder();
  TextWriter output = new StringWriter(sb);
  export.Execute(true, false, false, false, null, output);
}

  Execute(script, export, justDrop, format, connection, exportOutput)方法根据持久类和映射文件先删除架构后创建删除数据库架构。有六个参数,第一个为True就是把DDL语句输出到控制台;第二个为false就是不执行DDL语句;第五个为自定义连接。当export为true执行语句时必须打开连接。该方法不关闭连接,null就是使用默认连接,最后一个参数自定义输出,这里我输出到TextWriter中。

  2.SchemaUpdate工具实战

  现在数据访问测试层新建一SchemaUpdateFixture.cs文件用于测试生成实战。先声明一个全局变量_cfg:

private Configuration _cfg

  这里我用另外一种方式配置映射文件,先定义两个映射XML分别代表旧的和新的这样才能体现测试更新数据库架构的意义。

  旧映射XML:这里我使用Product持久化类,由于在之前我们定义了Product持久化类,这里直接模拟定义映射XML:拥有主键ProductId和Name字段。

public const string product_xml =
  "<?xmlversion='1.0'encoding='utf-8'?>" +
  "<hibernate-mappingxmlns='urn:nhibernate-mapping-2.2'" +
  "         assembly='DomainModel'" +
  "         namespace='DomainModel'>" +
  " <classname='DomainModel.Entities.Product,DomainModel'>" +
  "  <idname='ProductId'>" +
  "   <generatorclass='native'/>" +
  "  </id>" +
  "  <propertyname='Name'/>" +
  " </class>" +
  "</hibernate-mapping>";

  新映射XML:更新上面映射XML:主键ProductId(没有改变);Name字段:添加不可为空和长度为50;另外增加了Cost字段,类型为float不可为空。

public const string newproduct_xml =
  "<?xmlversion='1.0'encoding='utf-8'?>" +
  "<hibernate-mappingxmlns='urn:nhibernate-mapping-2.2'" +
  "         assembly='DomainModel'" +
  "         namespace='DomainModel'>" +
  " <classname='DomainModel.Entities.Product,DomainModel'>" +
  "  <idname='ProductId'>" +
  "   <generatorclass='native'/>" +
  "  </id>" +
  "  <propertyname='Name'not-null='true'length='50'/>" +
  "  <propertyname='Cost'type='float'not-null='true'/>" +
  " </class>" +
  "</hibernate-mapping>";
  测试前利用旧映射XML创建数据库架构:使用[SetUp]在测试前执行,按照旧映射XML创建数据库架构并格式化输出DDL语句:

[SetUp]
public void SetupContext()
{
  //模拟旧系统
  _cfg = new Configuration();
  _cfg.Configure();
  _cfg.AddXml(product_xml);
  var export = new SchemaExport(_cfg);
  export.Execute(true, true, false, true);
}

  测试更新数据库架构:使用SchemaUpdate类提供的唯一的Execute(script, doUpdate)方法按照新映射XML更新数据库架构:

[Test]
public void UpdateExistingDatabaseSchemaTest()
{
  _cfg = new Configuration();
  _cfg.Configure().AddXml(newproduct_xml);
  var update = new SchemaUpdate(_cfg);
  update.Execute(true, true);
}
  测试输出结果如图所示,如果你觉得不放心再看看数据库Product表。

  

  看到了吗?这显然不是我要求的,首先按照旧映射XML创建了数据库架构,但是更新数据库架构显得无能为力,仅仅增加了Cost字段,我想更新Name字段属性为不可为空和长度为50,但是SchemaUpdate工具不能做到!我觉得这个类目前还没有什么作用,期待下一个版本来完善。

  结语

  这篇文章通过实例介绍NHibernate中提供两个实用工具SchemaExport工具利用持久化类和映射文件生成数据库架构。SchemaUpdate工具通过持久化类和映射文件更新数据库架构。


来源: http://lyj.cnblogs.com   作者:李永京 


C#联合Halcon机器视觉框架源码—升级版 相较于之前的NxtVision,本软件代码架构更加合理,且新增。对源码有需求的,订阅本专栏后,私信我领取。、原来的vb脚本改为。 阅读详情

相关推荐

Dify DSL文件分享 Dify讨论群 大模型token资源等(持续收集更新)

基于LLMOps平台-Dify的一站式学习平台。包含不限于:Dify案例、DSL文件分享、模型接入、Dify交流讨论等各类资源分享。

同名公众号:dify实验室 3716

14.2 使用EXPDP

14.2.1 EXPDP 命令行选项 关键字               说明 (默认) ------------------------------------------------------------------------------ ATTACH                连接到现有作业, 例如 ATTACH [=作业名]。 COMPRESSION    

毅无涯 2830

基于 parallels ubuntu 20.04 LTS (focal) 的ros+px4+gazebo 安装

基于 parallels ubuntu 20.04 LTS (focal) 的ros+px4+gazebo 安装。

weixin_40132006的博客 2241

数据泵导入

数据泵导入 本章介绍了Oracle Data Pump导入实用程序。讨论了以下主题: 什么是数据泵导入? 调用数据泵导入 导入操作期间的过滤 导入的命令行模式下可用的参数 数据泵导入参数如何映射到原始导入实用程序的参数 导入的交互式命令模式下可用的命令 使用数据泵导入的示例 数据泵导入的语法图 什么是数据泵导入? 注意: 尽管数据泵导入(impdp)功能类似于原始导入实用程序(imp)的功能,但它们是完全独立的实用程

allway2的博客 2007

性能测试软件(LR12) 具体汉化(中文)方法

LoadRunner 12 的下载及安装详细过程请参考:https://blog.youkuaiyun.com/xiao66guo/article/details/105465854 1、在LoadRunner文件中找到 Setup.exe 可执行文件,并以管理员的身份运行: C盘 —> Temp—>HP LoadRunner 12.02 Community Edition—> D...

多谢大人光临寒舍,请随便看看,喝口茶吧 ☕️☕️☕️ 1993

LabVIEW小白福音:手把手教你用NI采集卡搭建振动信号采集系统(附源码和避坑指南)

本文为LabVIEW初学者提供详细的NI采集卡振动信号采集系统搭建指南,涵盖硬件连接、驱动安装、信号处理及性能优化等关键步骤。特别针对振动信号采集系统中的常见问题提供解决方案,并附源码和避坑指南,帮助用户快速上手并避免常见错误。

weixin_30485379的博客 103

ORACLE EXPDP的 EXCLUDE选项指定不导出的数据库对象

EXCLUDE = object_type [:name_clause ] [,...] 所述object_type指定对象的类型将被排除在外。要查看的有效值列表object_type,请查询以下视图:DATABASE_EXPORT_OBJECTS完整模式,SCHEMA_EXPORT_OBJECTS模式模式以及TABLE_EXPORT_OBJECTS表和表空间模式。列中列出的值OBJECT_PA...

allway2的博客 7409

一次把 PRIV mode 讲透:从 ABAP 内存分配链路到定位与治理

ABAP系统进入PRIV模式的本质是Extended Memory耗尽时转向Heap内存的应急机制。该现象会导致工作进程被独占,系统吞吐量下降。触发条件包括系统EM资源池耗尽或单个用户超过配额阈值。关键参数em/address_space_MB和ztta/roll_extension需协同调整。典型症状包括SM50显示PRIV状态、响应延迟和内存dump。治理需双管齐下:系统侧合理配置内存参数,代码侧优化内存使用模式,如分页处理、减少大内表操作和下推聚合逻辑。PRIV模式应作为异常信号而非常态目标,健康系统

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 203

DataDump基础框架及参数介绍

expdp/impdp工具看起来很像exp/imp,这里郑重的说明,这是两个不同的工具。通过expdp dump出来的文件,imp是无法dump进去库里,反之,亦然。 一、oracle数据库泵工具组件 1、命令行客户端 expdp和impdp 2、data pump api==>dbms_datapump pl/sql包 3、metadata api==>dbms_metadata pl/

数据库 3459

用 ABAP ADK 写一个可控的自建表归档程序:从选择屏幕到 ARCHIVE_SAVE_OBJECT 的完整链路

文章摘要: 本文介绍了SAP系统中数据归档的核心概念与实践方法。归档旨在将不常访问但需保留的数据从在线数据库移出,以减轻系统负载,同时满足合规要求。文章重点阐述了: 归档与备份、重组的本质区别 SAP归档框架的核心组件:归档对象(AOBJ)、归档管理界面(SARA)和ADK开发工具包 通过YAPTMAIN表示例,展示了完整的归档流程: 使用选择屏幕控制归档范围 管理归档会话 写入归档记录 生成统计报表 强调了归档程序设计中需要考虑的运维、审计和性能因素 该方案可有效解决自建日志表"悄悄长胖&quo

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 229

Android HAL 架构详解,底层开发不再难

HAL Binder 这套机制牛在哪?性能:一次拷贝,快如闪电。规范:HIDL 让接口定义整齐划一,维护省心。兼容:版本管理做得好,新老设备都能跑。有了这套通信体系,HAL 就像打了通脉,上下贯通,硬件操作变得丝滑无比。通信机制搭好了桥,接下来 HAL 得真正把手伸到硬件上。这部分是 HAL 的 “最后一公里”,直接决定硬件能不能被用起来。HAL 的接口定义是整个体系的灵魂,它决定了上层和底层怎么 “说话”。

大模型大数据攻城狮的专栏 1673

NHibernate之旅(19):初探SchemaExport工具使用

本节内容 引入SchemaExport工具SchemaUpdate工具实例分析结语 引入 我其实都是一直先编写持久化类和映射文件,然后使用SchemaExport工具生成数据库架构。这样的方式就是领域驱动设计/开发(DDD,Domain Driven Design/Development)。我的理解是系统的设计应该基于对象模型,主要考虑对象的设计和逻辑上,然后按照对象模型建立数据

u013948190的专栏 958

拼多多全站商品SKU数据爬虫实战:Python自动化采集与清洗

在电商数据分析领域,SKU(Stock Keeping Unit,库存量单位)数据是洞察商品策略、价格体系和市场竞争格局的核心抓手。本文以拼多多平台为研究对象,系统讲解如何利用Python构建一套完整的全站商品SKU自动化采集与清洗流程。文章涵盖目标分析与反爬策略、网络请求模拟、数据解析、分布式存储、数据清洗与标准化,以及调度与运维等全链路环节,并提供可直接运行的代码示例。拼多多API返回的数据结构大致如下(已脱敏):json"goods_name": "某品牌运动鞋",

2201_76125261的博客 216

NHibernate(面向.net)之旅:初探SchemaExport工具使用(本文与Hibernate无异)

NHibernate之旅(19):初探SchemaExport工具使用 2008-11-11 17:06 by 李永京, 10660 visits, 收藏, 编辑 本节内容 引入 SchemaExport工具 SchemaUpdate工具 实例分析 结语 引入 我其实都是一直先编写持久化类和映射文件,然后使用SchemaExport工具生成数据库架构。

pureboy的专栏 1346

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SchemaExport工具实战

SchemaExport工具实战通常我们使用生成数据库架构代码实例像这样:Configuration cfg=new Configuration();cfg.Configure(“”);SchemaExport export =new SchemaExport(cfg);export.Execute(....);1.准备工作现在数据访问测试层新建一SchemaExportF

liyangbing315的专栏 4490

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Hibernate之SchemaExport

Hibernate根据实体类和实体类映射文件生成数据表模型: 以前的常见例子,定义一个Class,在main方法的内容为: //默认读取hibernate.cfg.xml文件 Configuration cfg=new Configuration().configure(); //Create(script,export)方法根据持久类和映射文件先删除架构后创建数据库架构。

陈三的博客 3632

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

hibernate 5.0中如何使用SchemaExport

hibernate5.0 SchemaExport

幻影的专栏 3204

NHibernate之旅(20):再探SchemaExport工具使用

 source:http://www.cnblogs.com/lyj/archive/2008/11/13/1333026.htmlNHibernate之旅(20):再探SchemaExport工具使用 本节内容引入 实例分析 1.表及其约束 2.存储过程、视图 结语 引入上篇我们初步探索了SchemaExport工具使用,知道如何使用Sch

IT行业中技术是生产力一切之根 585

10 09Hibernate之SchemaExport工具

在大部分的开发环境下,实际上数据库的设计一定是在需求确认之后进行的,并且有了数据库之后才可以进行项目的开发,可是在Hibernate的设计之中考虑到了这样一种情况:有些人认为直接写数据库的脚本太麻烦了,所以打算直接编写程序,而当程序编写完成之后在通过程序导出数据库脚本。 或者在需求变更之后,程序代码发生了变化,但是数据库没有及时发生改变,为了让程序与数据库进行有效的同步更新,那么可以将当前程序中的数据库结构导出,而后生成数据库脚本。 org.hibernate.tool.hbm2ddl.SchemaExpo

weixin_43762330的博客 541

使用SchemaExport生成数据库表

今天来演示下使用SchemaExport生成数据库表 先来看下项目的整体架构: Score类 public class Score { private int id; private int stuId;//学生id private int subjectId;//课程Id private double result;//分数 public int getId() {

想念的专栏 2941
上一篇: Hibernate get和load区别
下一篇: 系统学习hibernate之一:利用hibernate中的SchemaExport生成数据表
randomnet
博客等级 码龄19年 59粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值