使用 GORM 的 Active Record 和 Hibernate

Active Record and Hibernate with GORM

来自 Ruby rails 背景,我习惯了 Active Record 和 运行 迁移(几乎所有需要数据库更改的东西)。我知道 Grails 是不同的,但 Hibernate 究竟如何适应?

这就是我的看法,

Active Record(RoR 的 ORM)= GORM(Grails 的 ORM)

Hibernate 适合什么地方? Rails 在没有 Hibernate 的情况下与数据库通信,为什么 Grails 需要休眠?

是否可以在没有 Hibernate 的情况下使用 Grails?

谢谢

可以在没有 Hibernate 的情况下使用 Grails。这是由于 GORM 的设计方式。 GORM 是一个抽象记录持久性的 API 层。有多种implementations,Hibernate 就是其中之一。

GORM 还在底层使用 Hibernate,即 GORM 是建立在 Hibernate 之上的。您可以在 Grails 中遵循两种方法:

  1. 通过使用 Java Pojo 持久性 类 来使用 Raw Hibernate 类。
  2. 使用域类。

Also is it possible to use Grails without Hibernate?

是的,它是但不是可取的。显然,您可以使用 Grails 中 spring 提供的 JDBC 模板。

GORM 是一个抽象层,它是实现中立的,可以有多个 gorm 实现,例如,gorm for hibernate,gorm for mongo db 或 gorm for cassandra。

现在回答你的问题"Where does Hibernate fit in" Grails(或 GORM)不实现自己的 ORM,它提供 api 的插件来扩展它,插件利用现有的 ORM 框架,如 Hibernate 或 JPA,并将对象关系映射的实际工作委托给这些框架.所以这里 Hibernate 才是真正完成这项工作的人,gorm 在现有框架之上提供了一个易于使用的 api。

存在多个 gorm 实现,hibernate plugin is one of these, but there's also gorm for mongodb plugin。如果你愿意,你可以创建你的插件来支持 gorm 的一些其他持久性技术。

Where does Hibernate fit in ? Rails talks to the database without Hibernate and why does Grails need hibernate?

轻松一点,这类似于说 “Grails 在没有 ActiveRecord 的情况下与数据库对话,那么为什么 Rails 需要 ActiveRecord” :)

ActiveRecord 和 Hibernate 恰好分别是 RoR 和 Grails 的“模型”层的数据库访问的默认实现。

其实对于Grails来说,把上面这句话中的“Hibernate”换成“GORM”更正确。就像正确提到的 OP 一样,它们在两个框架中扮演着“ORM 组件”的角色。 @Sudhir 和@Joshua 在他们的回答中已经涵盖了 GORM 被定义为比典型的 ORM 更高抽象级别的观点。但是,在所有 可能的 实现中,Hibernate 是默认的;所以假设“这是唯一的方法”并不罕见。

(作为旁注,GORM 可能不再是过去的首字母缩写词,其中 R = Relational,因为今天有许多非关系实现。现在是时候成为一个单词本身:“Gorm”;就像 "Ajax" is no longer the acronym it used to be :) 或者可能是“Grails 数据映射”的新首字母缩略词 GDM – 项目的 Github 名称?)

所以对你最后一个问题的简短回答......

is it possible to use Grails without Hibernate?

…是“是”。

但是,如果您问“在没有 Hibernate 的情况下使用 Grails 是否可取?”,答案将是:“这取决于……但出于实际目的不可以!”。 =16=]

如果您使用的是非关系数据存储,那么这很简单。您没有太多选择;每个非关系数据存储最多有 1 个 GORM 实现。事实上,您甚至可能被迫根本不使用 GORM(取决于实现是否足够好,甚至是否存在!)。顺便说一句,是的,Grails 也可以在没有 GORM 的情况下使用!是否值得,是针对特定项目做出的决定。

但是,如果您使用的是 关系型 数据库并且仍然不想使用 Hibernate,则可以使用 gorm-jpa 使用 GORM 的 JPA 实现插入。但自 2012 年以来,它似乎没有超越里程碑版本。而且我从未使用过它,以便能够评论它是否完美运行(或至少与 Hibernate 一样好)。

或者如果出于任何原因您发现 Active Record pattern (RoR's default implementation) suits better for your application than the Data Mapper pattern (this is what Hibernate follows), then you could probably use something like JavaLite or ActiveJPA 甚至 Spring JDBC 模板(@Vivek 提到,但您必须首先使用 ActiveRecord 模式实现它),然后要么独立使用它(在 GORM 之外),要么甚至可能使用其中之一实现您自己的 ActiveRecord 模式的 GORM 实现。谁知道呢,这可能会让其他 Rails 开发人员更容易使用 Grails :)

tl;博士

换句话说,将 Grails 与关系数据库一起使用的最安全、最快捷的方法是使用 GORM 的 Hibernate 实现。

备注

对于迁移,Liquibase 是一个很棒的工具。甚至还有 Grails plugin.