您是不是会将 NHibernate 用于具有部分无法控制的遗留数据库的项目?

Posted

技术标签:

【中文标题】您是不是会将 NHibernate 用于具有部分无法控制的遗留数据库的项目?【英文标题】:Would you use NHibernate for a project with a legacy database, which is partly out of your control?您是否会将 NHibernate 用于具有部分无法控制的遗留数据库的项目? 【发布时间】:2009-01-17 22:57:22 【问题描述】:

对我来说,目前的答案是:不,我会使用 iBatis,因为当数据库模型和对象模型不同步时,NHibernate 很痛苦。如果我不能完全控制数据库,我最终会做很多工作。

我为什么要问?

嗯,首先:我从未使用过 NHibernate。我只是从表面上知道。我已经阅读过 iBatis 对遗留数据库的优势。

第二:最近我和一个使用 Hibernate 的人进行了讨论(jep,在 Hibernate 之前没有'N')。他告诉我,ORM 框架现在非常先进,并且提倡 Hibernate。由于我对 NHibernate 不感兴趣,所以我没有跟踪最近的发展。

也许我是时候重新考虑我的答案了?

【问题讨论】:

这将是我关于 *** 的下一个问题 - 感谢您的提问! 【参考方案1】:

iBatis 很容易将对象映射到遗留数据库系统。

最近 NHibernate 1.2 和 2.0 有一个功能集,可能会让您重新思考 iBatis。

NHibernate 使用复合键,这在较旧的数据库中经常出现,使用起来并不总是令人愉快,但对此提供了支持。

NHibernate 可以利用存储过程对实体以及数据库视图进行 CRUD 操作。

集合可以是自定义存储过程或 SQL 查询。当外键关系不直接映射到另一端的主键时,集合可以使用 property-ref 属性。

其中一些功能可能会削弱 nhibernate 的性能/功能,即使用 property-ref 的延迟加载不起作用(根本?),但大多数情况下都有原因。

其他点:(与您的旧数据库没有真正的关系,但仍然可以帮助决定技术选择)

Nhibernate 社区似乎比 iBatis 丰富得多。我在这两个列表上,与 iBatis 组相比,对 NHibernate 的支持量相当大。所以支持应该更容易。

还有越来越多的 NHibernate 的 contrib/3rd 方工具。诸如 NHibernate Profiler、Nhibernate 查询分析器、NHibernate Contrib、Fluent NHibernate 等等。

也许您可以扩展您认为 iBatis 目前具有的优势。 NHibernate 最近肯定非常活跃,并且获得了许多新功能,其中很多确实有助于遗留/难以修改的架构。

为了回答这个问题,是的,我们确实将 NHibernate 与具有糟糕关系、复合键、破坏关系的遗留数据库一起使用。我们还有少量基于 iBatis 的代码。不过,我们不再编写任何 iBatis 代码。

【讨论】:

【参考方案2】:

是的,考虑 NHibernate。这是黄金标准是有原因的。我听说 iBATIS 支持疯狂的映射可能性,但是使用 NHibernate 的 IUserType 你可以映射任何东西,甚至是非常奇怪的列。

@Ahmad,ORM 的全部意义在于防止对象和模式之间的紧密耦合。如果你有这个问题,那你就做错了。

此外,NHibernate 有很多用于自定义查询、公式属性和存储过程的选项。 HQL 非常强大,Criteria 非常灵活。

我认为,如果您至少不使用 NHibernate,您将对您的客户造成伤害。

【讨论】:

表之间真正疯狂的连接怎么样?因为它部分是一个遗留数据库,所以还需要一些手动 SQL 语句。【参考方案3】:

我一直在现有应用程序中使用 nHibernate。我将它用于所有新的开发,我无意将现有的东西移植到那里,只是没有令人信服的理由,但对于项目中的新东西,它工作得很好。

如果您要移植代码,那么您应该能够更改数据库以更好地匹配您的域模型,而不会产生太大影响(取决于您的数据库的泄漏程度,即访问它的人)。但是,更改域模型会影响应用程序。

【讨论】:

这不是代码端口。旧应用程序的许多部分仍然存在,应该添加功能。数据库结构部分是我无法控制的(因为应用程序的旧部分以及其他现有部分的依赖关系)。

以上是关于您是不是会将 NHibernate 用于具有部分无法控制的遗留数据库的项目?的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 的生产版本

您是不是应该在 NHibernate 和 Sql Server 2008 中使用外连接获取?

Laravel - 具有多重身份验证的未经身份验证的重定向问题

我在哪里可以获得用于 NHibernate 的 Linq?

使用 Nhibernate 更新不是身份的对象 ID

更改 NHibernate 中的初始 LazyLoad 行为