标签
作者
Hibernate 3.3.0.GA 已发布。感谢所有帮助我们取得这一成果的人。
Subversion 移动
将 Hibernate 源代码移至我们新的 Subversion 主机已完成。已设置开发者和匿名访问。目前,Web 访问只能通过 Apache 模块进行,这并不理想。我们被告知,很快将设置通过 Fisheye 或 ViewCVS 访问 Subversion 仓库。
最近在 Hibernate 的 JIRA 中打开了一份错误报告,指出 Hibernate 错误处理了死锁场景。报告的基础是《/Pro Hibernate 3/》一书中的示例(第9章)。对于那些可能不熟悉术语“死锁”的人来说,其基本含义是两个进程各自持有对方完成处理所需的资源锁。虽然这种现象不仅限于数据库,但在数据库术语中,其想法是第一个进程(P1)持有一个给定行(R1)的写锁,而第二个进程(P2)持有一个另一行(R2)的写锁。现在,为了完成其处理,P1 需要获取 R2 的写锁,但无法这样做,因为 P2 已经持有其写锁。相反,P2 需要获取 R1 的写锁以完成其处理,但无法做到,因为 P1 已经持有其写锁。因此,P1 和 P2 都无法完成其处理,因为每个都在无限期地等待对方释放所需的锁,而它们无法这样做,直到其处理完成。在这种情况下,这两个进程被认为是死锁的。
多表批量操作
批量操作
《EJB3 持久化规范》要求实现者支持在 EJB-QL(即《EJB 查询语言》)中的《批量操作》。作为 Hibernate 实现 EJB3 持久化的一部分,HQL(即《Hibernate 查询语言》,它是 EJB-QL 的超集)需要支持这些《批量操作》。现在这项支持已经完成编码,甚至超出了 EJB3 持久化规范所提供的功能。HQL 的批量操作支持仍有一个待处理的任务,但这完全超出了 EJB3 持久化规范所要求的支持范围。我稍后会写一篇博客来介绍这个令人兴奋的话题;)
当前(上下文)会话
Hibernate 3.0.1 中的新功能是 SessionFactory.getCurrentSession() 方法。它允许应用程序开发者将当前会话的跟踪委托给 Hibernate 本身。这是一个相当简单的功能,但几乎任何 Hibernate 用户都不得不自己实现,或者依赖于第三方工具来完成。让我们来看看 Hibernate 中是如何实现这一功能的,以及它可能有哪些用途。
Hibernate3 中的另一个重大变化是采用事件和监听器范例作为其核心处理模型。这允许在外部、由应用程序发起的请求下,非常精细地钩入 Hibernate 的内部处理。它甚至允许自定义或完全覆盖 Hibernate 对这些请求的反应方式。这实际上是对 Hibernate 早期通过 Interceptor、Lifecycle 和 Validatable 接口所尝试实现的功能的扩展。
Hibernate3 增加了预定义过滤条件并在类和集合级别附加这些过滤器的功能。什么是《预定义过滤条件》?这实际上是可以定义一个类似于现有类和集合元素上可用的《where》属性的 limit 子句。不过,这些过滤条件是可以参数化的!应用程序可以在运行时决定是否启用给定过滤器以及它们的参数值。