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

这篇文章是介绍,NHibernate的好文,适合正在研究该框架的朋友,本帖只做转载处理,而且根据作者的要求在文章中贴出相关链接,仅为学习之用如果觉得侵犯了您的权益,请来信告知,我们会尽快删除!

作者:李永京(YJingLee's Blog)
出处:http://lyj.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

本节内容

引入
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 =
    "" +
    "+
    "                 assembly='DomainModel'" +
    "                 namespace='DomainModel'>" +
    "  " +
    "    " +
    "      " +
    "    " +
    "    " +
    "  " +
    "";
新映射XML:更新上面映射XML:主键ProductId(没有改变);Name字段:添加不可为空和长度为50;另外增加了Cost字段,类型为float不可为空。public const string newproduct_xml =
    "" +
    "+
    "                 assembly='DomainModel'" +
    "                 namespace='DomainModel'>" +
    "  " +
    "    " +
    "      " +
    "    " +
    "    " +
    "    " +
    "  " +
    "";
测试前利用旧映射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工具通过持久化类和映射文件更新数据库架构。

利用hibernate中的SchemaExport生成数据表相关推荐

  1. cad高程如何提取到cass软件_从CAD平面图中提取坐标生成数据表

    功能:在CAD中提取点的三维坐标(提取当前坐标系中坐标)直接生成Excel表,并在CAD图中生成坐标数据表,加了标点号和输出的选项.   如何安装: 1,在CAD平面图中→工具→宏→加载工程→加载下载 ...

  2. oracle中修改多个字段默认值_利用VBA代码在已有的数据表中删除、添加、修改字段...

    大家好,今日继续给大家讲解VBA数据库解决方案的第21讲,如何利用VBA代码在已有的数据表中删除,添加,修改字段.这个内容是操作数据库的一项必修的内容,还望大家在实际工作中多利用,所以这节的知识,对于 ...

  3. 在MySql数据库中创建数据库dbjava,数据表book,字段包括bno,bname,price,count(编号、书名、单价、数量)。 利用JDBC连接数据库dbjava,实现数据表的增删 改查

    题目 1.在MySql数据库中创建数据库dbjava,数据表book,字段包括bno,bname,price,count(编号.书名.单价.数量). 2.利用JDBC连接数据库dbjava,实现数据表 ...

  4. 配置spring整合jpa自动生成数据表

    配置spring整合jpa自动生成数据表 applicationContext.xml <?xml version="1.0" encoding="UTF-8&qu ...

  5. 模拟hibernate的注解来创建数据表,内置注解

    目录 导读 注解释义 注解定义 内置三大注解 override注解 Deprecated注解 SuppressWarnings注解 元注解 SOURCE和RUNTIME的区别 SOURCE RUNTI ...

  6. Hibernate中的三种数据持久状态和缓存机制

    Java三大框架之--Hibernate中的三种数据持久状态和缓存机制 Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没 ...

  7. 《从Excel到R 数据分析进阶指南》一第1章 生成数据表1.1 导入数据表

    本节书摘来自异步社区<从Excel到R 数据分析进阶指南>一书中的第1章,第1.1节,作者 王彦平(蓝鲸),更多章节内容可以访问云栖社区"异步社区"公众号查看 第1章 ...

  8. 用Python做数据分析之生成数据表

    第一部分是生成数据表,常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据. Excel 中的文件菜单中提供了获取外部数据的功能,支持数据库和文本文件和页面的多种数据源导入. 获取外部数据 ...

  9. 《从Excel到Python——数据分析进阶指南》一第1章 生成数据表

    本节书摘来自异步社区<从Excel到Python--数据分析进阶指南>一书中的第1章,第1.1节,作者 王彦平(蓝鲸),更多章节内容可以访问云栖社区"异步社区"公众号查 ...

最新文章

  1. 移动磁盘由于IO设备错误,要怎样寻回文件
  2. idea软件,如何不每次弹出“欢迎界面!”
  3. hdu 5441 Travel(Kruskal+离线)
  4. android异步线程利用Handler将消息发送至UI线程
  5. mysql mariadb并存_MariaDB与MySQL并存
  6. 快速入门:OpenShift上的Spring Boot和WildfFly 8.2
  7. JDBC分页查询及实现
  8. 输入URL经历的过程
  9. deploy dubbox 到私有的 nexus 服务
  10. Javascript浏览器事件(上)
  11. win10安装Dreamweaver cc 2019报无法写入注册表的错误
  12. 专业的庆典策划应该注意哪些礼仪
  13. FPGA进阶(2):基于I2C协议的EEPROM驱动控制
  14. vultr 安装docker
  15. 我读故我在:《文凭社会》读后感
  16. 科普NGK公链生态板块旗下的BGV、SPC、NGK、USDN四大币种
  17. 宝安区-西乡街道-各社区-住宅小区信息
  18. 开尔文夹接线图解_开尔文测试法
  19. 为什么说真理掌握在少数人手中
  20. 哪些原因会造成海外出国留学申请不成功?

热门文章

  1. 查看Full GC方法:1,jconsel:2,linux 命令: jstat -gcutil id 4s 10003,linux 命令(前提有.gc日志):c
  2. 操作系统之文件管理:6、文件的基本操作(创建文件、打开文件、删除文件、关闭文件、读文件、写文件)
  3. (王道408考研操作系统)第二章进程管理-第三节3:实现进程互斥的硬件方法
  4. SGCheck:一个实验堆栈和全局数组溢出检测器
  5. C++11 并发指南六( atomic 类型详解二 std::atomic )
  6. SO_REUSEADDR SO_REUSEPORT 解析
  7. OSI七层模型都是什么?
  8. Ubuntu 18.04-20.04开机自动root用户登录(测试可用)
  9. docker-compose(入门,与docker的区别)
  10. Python 域名转IP(可包含http、https)