让我困扰nHibernate的一件事是它不是100%编译时间。
如果我重命名数据库表中的列,并更新该表的映射文件,当我点击编译时,我应该在我引用该列名称的所有查询代码(hql / criteria)中得到错误如何拼写错误。
使用ORM的重点(对我而言)是数据库更改不会破坏我的查询。
换句话说,我将在编译时通知需要修复的内容,而不是获取运行时错误等。
答案 0 :(得分:4)
要实现您的目标,我认为您最好的解决方案是使用Fluent NHibernate和nhlambdaextensions的组合。流畅的NHibernate将为您提供类型安全的映射文件检查(因此,如果您更改实体的属性,如果您不更改映射类的属性,编译器将抛出错误)。 lambda函数扩展将通过Criteria API为您提供类型安全的查询(而不是HQL,因为它只是魔术字符串SQL-with-objects)。
也是为了澄清你的问题,你说:
如果我更改了一个列(重命名) 数据库表,我更新了 我的那个表的映射文件 命中编译我应该得到所有错误 我的查询代码(hql / criteria) 我引用该列名称的位置 以及如何拼错。
只是更改数据库端应该不会中断(假设您也在XML映射文件中进行了更改)。您的代码不引用映射的column="first_name"
部分,它引用name="FirstName"
部分。如果您不更改实体,只要您更新映射文件,重命名数据库中的列(例如,从“firstname
”到“first_name
”)将不会破坏您的查询
答案 1 :(得分:1)
你应该看看Castle ActiveRecord。我之前使用过它,它允许你不必担心映射文件(.hml)。它允许您在类级别定义中进行更改,并且映射文件通常不受影响。
如果您正在编写错误的查询,这听起来像是设计问题,而不是nHibernate问题。
答案 2 :(得分:1)
如果没有更改属性名称,您将不会收到错误,因为大多数人在NHibernate中使用HQL进行查询。但是,如果您确实更改了属性名称而不是HQL,那么您确实会得到破坏的查询,例如:
FROM User Where User.Surname = 'bob'
将Surname属性更改为Lastname,它将会中断。这是NHibernate缺乏的一个功能,但它会为contrib创建一个很好的项目 - 一个Subsonic风格的查询界面。 This a project类似但仍然使用HQL。
如上所述,ActiveRecord和Fluent NHibernate最接近使用NHibernate进行类型检查。两者都强制你从他们的基类继承你的类,正如你所期望的那样ActiveRecord并不打算用于生产用途--Ayende在一个视频中说过它是NHibernate的原型工具。
答案 3 :(得分:0)
Hibernate使用动态字节代码生成,根据映射配置创建映射类。
ORM的基本要点是在对象和关系系统之间启用自动魔法映射(桥接)。因此:ORM。
答案 4 :(得分:0)
如果你想强烈地输入你的对象而不是使用xml配置,如果没有经过适当的测试就会导致很多运行时问题,我会研究一下FluentNHibernate,它有一个允许你将类映射到代码中的数据的约定映射。让我的生活变得更轻松,特别是当我第一次开始使用NHibernate时,我希望在我知道如何使用xml正确映射之前找到它
答案 5 :(得分:0)
NHibernate是否具有Java版本的模式验证器?在这种情况下,您可以在构建过程中添加一个步骤来构建会话工厂并运行验证器 - 构建会话工厂也应该编译命名查询,因此也验证它们。
嗯,看起来它支持这样的东西:http://nhibernate.info/blog/2008/11/22/nhibernate-schemavalidator.html
注意这意味着如果您的开发数据库不可用,您的构建过程将无法工作 - 我认为这是一件坏事。