第一行用于更新 ID 为 12 的雇员,使其拥有一间新的办公室。第二行用于将职位为主管的人更改副总裁。正如您所见,update 方法要求使用对象的 ID,这将强制它只更新一行。
用 ActiveRecord 删除行同样地直观。有一种 delete 方法可使用一个 ID 或一组 ID。delete_all 方法与 update_all 方法相对应,前者将删除匹配指定条件的所有行。
使用 ActiveRecord 事务
要完成早前做出的 ActiveRecord 与 JDBC 示例的比较,添加插入 David Duke 的事务。为此,需要把 newEmp.save 行更改为清单 13 中所示的一行。
清单13:添加插入事务
Employee.transaction do
newEmp.save
end
如果事务包括了其他失败的代码,则 David Duke 将不会被添加到数据库中。在本例中,这是不会发生的,因为每个独立对象的保存(对于插入和更新)都被 ActiveRecord 打包在事务中。要管理多次插入、更新或删除时有必要这样做。
如果事务包括了其他失败的代码,则 David Duke 将不会被添加到数据库中。在本例中,这是不会发生的,因为每个独立对象的保存(对于插入和更新)都被 ActiveRecord 打包在事务中。要管理多次插入、更新或删除时有必要这样做。
正如您所见,ActiveRecord 易于使用。ActiveRecord-JDBC gem 的发布为在 JRuby 内使用 Derby 提供了一种很好的方法。全面讨论 ActiveRecord 超出了本教程的范围,但查看 参考资料 部分可获得一些有用的参考。
ActiveRecord 与 JDBC 相比较
决定使用哪些持久性机制取决于您的需求。如果要与现有 Java 代码库进行交互,而该代码库又与 Derby 进行通信,则应最可能使用 JDBC。如上所述,可能有一个预存在的隔离层,用于处理与数据库进行的所有通信,并且已包含并使用了那些类或软件包。如果要编写使用 Derby 的新应用程序并且不要求使用 Java 代码,则可以在 Ruby 中编写全部代码并使用 ActiveRecord 用于持久性。
您还可以编写一个新应用程序,但需要与不遵循任何 ActiveRecord 约定的传统数据库进行交互。在这种情况下,使用 Hibernate 可能比较合适。ActiveRecord 在这样的数据库上运行最佳:表中一行映射到一个对象实例。这不是说 ActiveRecord 无法处理表之间的关系。ActiveRecord 可以很好地处理一对一、一对多和多对多关系。但是,如果表中的几列映射到一个对象,其余列映射到另一个对象 —— 表示一张表有来自不同对象的字段 —— 则 ActiveRecord 不再适用。JRuby 的力量在于如果需要使用 Hibernate、iBatis 或直接使用 JDBC,则它们全都可用,因为您可以使用 Java 库。
结束语
本教程讨论了在 JRuby 内使用 Derby 作为持久性存储的各种方法。了解了如何通过 JRuby 的 include_class 和 include_package 方法在 Ruby 脚本内使用 JDBC。然后了解了在 JRuby 内使用 ActiveRecord 的新功能的知识,并获得了每种方法何时使用比较适当的一些提示。