今天早上看到一篇好文<使用NHibernate进行数据持久层开发的最佳实践>
个人认为写得很好,唯其不足就是过于抽象
实际上这篇文章就是理清了使用NHIBERNATE后开发持久层的一个顺序,当然,这个不是唯一,但是,如果是一个新项目,那确实是一个"最佳实践"
写好HBML.XML文件->使用Nhibernate.Tool.Hbm2Net生成POJO对象-->同时使用Hbm2DDL来导出或直接在数据库中生成数据表,这样可以减轻不少负担
需要注意的是Hbm2DDL功能是包含在NHIBERNATE中的,这个部分如何使用,可以参见NHIBERNATE的EXAMPLE和TEST项目,里面的例子非常棒
但是NHBIERNATE.TOOL.HBM2NET就不一样了,它是NHibernateContrib的一部分,所以,你必须下载NhibernateContrib才能使用
一开始,我使用以前下载的NHIBERNATE1.0.1版本和NhibernateContrib1.0.1版,使用NANT编译NhibernateContrib发生错误,于是用VS2003打开解决方案,用VS来编译(VS能提供更为详尽的错误信息),错误一大堆,首先的一个错误发生在
F:\SoftWare\DotNet\Persiste\NHibernateContrib-1.0.2.0\src\Nullables.Tests\NullableCharFixture.cs(92):   Assert.IsTrue(ParseToStringValue('?));
一眼看出,少了个单引号(真奇怪,难道开发人员没有成功编译就交出来吗?或者他们在交出来的时候搞错了这个文件的版本,又或者这根本是CONTRIB开发人员给我们开的一个小小的玩笑)
接下来有几条错误都是与SNK密钥文件有关,直接打开各个项目的AssemblyInfo.cs文件,把与SNK文件有关的行删掉就行了
把这些都修正后,重新编译,OK

接下来,试一试Nhibernate.tool.hbm2net.exe啦
如果是nant编译,你就进入build文件夹,一层一层找到nhibernate.tool.hbm2net.exe
这是一个命令行工具,这里,我要批评一下开发人员了,既然提供了这么一个工具,为什么不把它稍稍完美一下呢,就算命令行工具,当使用人员不输入任何参数时也要给出一个使用说明以及参数含义列表吧,可是nhibernate.tool.hbm2net竟然没有,没有法子,打开Nhibernate.tool.hbm2net项目查看,在CODEGenerator.CS文件中发现了它对参数的判断(够晕的)

for (int i = 0; i < args.Length; i++)
                {
                    if (args[i].StartsWith("--"))
                    {
                        
                        if (args[i].StartsWith("--config="))
                        {
                            // parse config xml file
                            Document document = new XmlDocument();
                            document.Load(args[i].Substring(9));
                            globalMetas = MetaAttributeHelper.loadAndMergeMetaMap((document["codegen"]), null);
                            IEnumerator generateElements = document["codegen"].SelectNodes("generate").GetEnumerator();
                            
                            while (generateElements.MoveNext())
                            {
                                generators.Add(new Generator((Element) generateElements.Current));
                            }
                        }
                        else if (args[i].StartsWith("--output="))
                        {
                            outputDir = args[i].Substring(9);
                        }
                    }
                    else
                    if ( args[i].IndexOf("*") > -1 )
                    {
                        // Handle wildcards
                        mappingFiles.AddRange( GetFiles( args[ i ] ) );
                    }
                    else
                    {
                        mappingFiles.Add(args[i]);
                    }

可以看出来这个命令行有一个以上参数,其中两个是可选的,使用开式如下:
Nhibernate.tool.hbm2net Hbm文件1 [hbm文件2]  [hbm文件3]...[hbm文件n] [--config=config文件][--output=输出目录]
所以,一般来说,你只要这样用就成了
Nhibernate.tool.hbm2net blogitem.hbm.xml
nhibernate.tool.hbm2net *.hbml.xml --output=c:\temp\prj1
nhibernate.tool.hbm2net blogitem.hbm.xml blog.hbm.xml

看到这里,如果你以为OK了,那你就错了,虽然编译成功了,但是我注意到VS2003有两条提示是关于Log4net版本问题的
警告: 不能将项目“NHibernate.Tasks-1.1”中的依赖项“log4net, Version=1.2.1.40796, Culture=neutral, PublicKeyToken=aaa0f432407c68df”复制到运行目录,因为它将改写引用“log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905”
运行的时候,会出现LOG4NET的错误提示而无法继续执行(这点也看出来,开发人员处理的不好,至少LOG4NET出现问题是不会影响到CONTRIB主体功能的,应该进行异常处理并提示用户是否继续为妥吧)
进行到这里,发现不行,于是,在每一个CONTRIB项目文件中找到LOG4NET的引用,看是否有引用特定版本的地方,发现每一个文件都引用的是LOG4NET 1.2.9,根本没有用引1.2.1的地方,郁闷,难道就此放弃?
在GOOGLE上搜了一下类似错误,找到一位同学说
"如果A项目中引用了c.dll,版本是1.1而在B项目中同时引用了A项目和c.dll的1.2版,VS就会提示上面的错误信息"
比对一下,意思很明显,就是CONTRIB所引用的DLL中,有某个DLL引用了LOG4NET,但是,它是引用的1.2.1版本,所以导致此错误信息
经查是NVelocity.dll这个DLL引用了LOG4NET 1.2.1版,但是也没办法呀
于是,去NHIBERNATE的老家,刚好看到它新出来1.0.2版,于是,下载
重新编译,发现1.0.2中竟然也有"少引号"这么低级的错误,于是,像上面一样,逐个修正
更好笑的是1.0.2的BUG更多一些,Hbm2NET和Task项目中引用了LIB文件夹(就是说,有引用某DLL,VS就在这个文件夹中找),但是,我打开LIB文件夹,却没有NVelocity.dll文件(晕了吧),跟1.0.1版比,LIB文件夹少了好几个文件
想想办法,移花接木,就把1.0.1下的nunit.core.dll和NVelocity.dll等几个相关的DLL复制到LIB文件夹下,再编译,终于通过,用NANT编译一下(NANT编译完的很干净,直接在BUILD文件夹下,不用到处找)
这回,打开命令行提示窗,复制一个NHIBERNATE例子中的HBM.XML文件,BLOGITEM.HBM.XML,输入:nhibernate.tool.hbm2net blogitem.hbm.xml
COMMAND空显示:"nhibernate.tool.hbm2net"既不是命令,也没有此文件
我再晕
用DIR一列,噢,原来1.0.2把它改名了,现在叫nhibernate.tool.hbm2net.console.exe
输入nhibernate.tool.hbm2net.console blogitem.hbm.xml,顺利执行
执行完后,多了个Generated文件夹,一层层进去generated/nhibernate/examples/blogger/blog,nhibernate,终于看到一个文件examples.cs(我倒,难道不会跟HBM文件的主文件名相同吗?还有,目录级次太深了吧,生成的命名空间也是深不见底呀)
大家有兴趣的可以试试,不管怎么说,我觉得这是一个不错的主意,只是,tool2net工具写的太次了,有时间的话,哪位高手哥哥可以修正一下它的BUG,改的更好点,最好有个GUI,那就棒了

另外,HBM文件,写起来也很容易,你只要复制NHIBERNATE里的两个XSD到C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Packages\schemas\xml就行了,另外,如果你实在觉得手工写太累,OK,去http://www.ayende.com/下载个Nhibernate Query Analyzer就可以了,它是一个GUI的NHIBERNATE配置及映射文件编辑器,而且也是一个HQL的执行容器

补充,再次看了一下NhibernteContrib的代码,彻底搞清了它的用法:
nhibernate.tool.hbm2net.console [hbm.xml文件列表|path\*.hbm.xml] --output 输出文件夹 --config hbm2net的配置文件
不过,需要注意的是以下几点:
1,如果执行该程序时,不在其BIN文件夹的话(就是CONFIG文件跟EXE文件没在一起的话,必须指定CONFIG选项),这时程序执行,没有任何错误提示,但是,没有成功
2,如果使用通配符法的时候,一定要使用完整的WINDOWS路径,eg.C:\temp\*.hbml.xml,如果hbm.xml文件跟nhibernate.tool.hbm2net.console在一个文件夹时,也不能写成nhibernate.tool.hbm2net.console *.hbm.xml,因为在程序中,它是以最后一个反斜杠(\)作为路径的截取字符的,如果你不写出这个\来,程序一样无法执行(有点变态吧),所以,正确的写法是:nhibernate.tool.hbm2net.console .\*.hbm.xml即可
3.如果不写output选项,则输出会在当前文件夹.会生成一个generated文件夹,然后就是取映射文档中指定的CLASS名称中的程序集名的最后一段,生成子文件夹,再取CLASS名称中类名的NAMESPACE中最后一段,生成三级文件夹,最后,才是取类名,生成形如"类名,命名空间"的四级文件夹,最终生成的类文件就在里面了.(不得不说,这个主意考虑到了命名空间的层级问题,可是,用逗号做文件夹名称中的一部分,实在不是个好主意,还有,我们经常需要的是生成平坦的,就是HBM.XML和类文件夹在一级的方式)
如果你想把结果放在别处,可以加上--output directory就可以了,不过,文件夹结构是一样的

转载于:https://www.cnblogs.com/Heroman/archive/2006/02/10/328267.html

使用Nhibernate.Tool.Hbm2Net来根据HBML文件生成POJO类的代码相关推荐

  1. xml文件的书写及读取books.xml文件生成Book类

    books.xml文件的书写: <?xml version="1.0" encoding="UTF-8" ?> <!-- <?xml v ...

  2. 如何使用MonoXSD / xsd.exe使用xsd文件生成C#类?

    文章目录 引言 什么是MonoXSD/xsd.exe 如何使用 xsd.exe的参数解析 引言 之前写了这两篇,对OpenDRIVE文件的读写有了一点认识. [C#]读写XML文件总结 OpenDRI ...

  3. pb文件生成java类,根据proto文件生成pb和pb_service文件

    假如有一个HelloWorld.proto文件,内容如下: syntax = "proto3"; option java_package = "ex.grpc" ...

  4. dtd文件生成java类

    最近需要用dtd文件生成对应的Java类,其中xsd生成Java类之前已经说过了 其中 C:\Users\Administrator>xjc  -dtd  D:\eclipse_wks\IDS_ ...

  5. java maven 读取 dbf 文件 生成 表结构 示例代码

    介绍 通过读取一个文件夹下所有dbf文件 然后生成sql 依赖 <dependency><groupId>com.github.albfernandez</groupId ...

  6. Avro根据avsc文件生成java类

    背景 Avro可以提供跨语言的数据交互,下面记录如何通过Avro生成java类 步骤 1.定义avsc文件,里面包含类的一些信息,比如包名.类名.属性列表等,示例如下 {"namespace ...

  7. linux将所有文件生成lst_10行Python代码自动清理电脑内重复文件,解放双手!

    作者:陈熹 来源:早起Python 大家好,又到了Python办公自动化系列. 今天分享一个系统层面的自动化案例: 「给定一个文件夹,使用Python检查给定文件夹下有无文件重复,若存在重复则删除」 ...

  8. 如何引用XML文件生成C#类

    目录 XSD File Generate Class File Simply. 1 Why use XSD file to create C# classes?... 2 How to convert ...

  9. php上传2个文件代码,php文件上传类程序代码(2)

    $dst_name = $this->set_newname($source_img); $this->img_output($thumb,$dst_name);//输出图片 imaged ...

  10. [转]在VS中为C/C++源代码文件生成对应的汇编代码文件(.asm)

    原文链接:https://www.cnblogs.com/lulipro/p/9926474.html 转载申明:感谢原作者!如有侵权,请联系我删除,谢谢

最新文章

  1. 独家 | 教你用卷积神经网络对视觉神经元进行建模(附资源)
  2. 8.6亿个人信息被偷 网络安全团队曝光交易内幕
  3. Java 动作事件_java按钮动作事件
  4. JDK 12开关表达式遇到意外的枚举值
  5. Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(4) - 32位EFLAGS - 状态标志与控制标志
  6. 如何设置 Windows 默认命令行窗口大小和缓冲区大小
  7. 如何使用C#操作WinAPI
  8. LINUX Telepresence编译详细过程记录
  9. MyBatis的四种资源加载方式以及优先级
  10. 苹果屏保壁纸_抖音超火的时间轮盘屏保,安卓苹果都可以用。
  11. 问题解决-Visio2016和Office不能并行
  12. springboot的web进阶知识(2)
  13. C/C++遍历文件夹指定文件
  14. 职称论文发表格式要求
  15. 97年大学计算机考试是 级,1997年9月全国计算机等级考试一级笔试试卷 DOS
  16. CentOS7下 SVN版本控制的安装(包括yum与非yum)的步骤记录。
  17. 无损检测行业市场发展机遇分析及市场规模竞争战略可行性研究预测
  18. 帝国CMS7.2管理员密码重置
  19. 文件上传漏洞靶场upload-labs学习(pass1-pass5)
  20. 园区管理系统平台 V2.0 发布了

热门文章

  1. 计算机属性内存处理器不可用,电脑属性显示处理器和安装内存不可用怎么回事...
  2. DMA小区漏损治理之武林秘籍
  3. 微信小程序——推箱子小游戏
  4. android 输入法字典_Android输入法-创建输入法
  5. 大疆御2电池数据查看教程
  6. 记录一下何同学采访苹果CEO库克的对话,感兴趣的快来围观
  7. win7 64位安装 ie10/11失败
  8. 《Offer一箩筐》一份高质量「简历」撰写指南,望打扰!!
  9. python将姓王的都改成老王_全域明星-第46章:校长姓王,隔壁老王?-爱阅小说网...
  10. Elasticsearch可视化管理工具dejavu的安装使用