9;Take me to your leader (please)', null) update MESSAGES set MESSAGE_TEXT = 'Greetings Earthling', NEXT_MESSAGE_ID = 2 where MESSAGE_ID = 1 当第一个Message对象的text属性和nextMessage被程序修改时,请注意Hibernate是如何检测到这种变化,并如何在数据库中自动对它更新的。这实际上是Hibernate的一个很有价值的特色,我们把它称为“自动脏数据检测”,Hibernate的这个特色使得当我们修改一个持久对象的属性后,不必显式地通知Hibernate去将它在数据库中进行更新。同样的,当第一个Message对象调用setNextMessage()方法将第二个Message对象作为它的下一条消息的引用时,第二条消息会无需调用save()方法,便可以自动地保存在数据库中。这种特色被称为“级联保存”,它也免去了我们显式地对第二个Message对象调用save()方法之苦。 如果我们再运行先前的那段将数据库中所有的Message对象都打印出来的代码,那它的运行结果如下: 2 message(s) found: Greetings Earthling Take me to your leader (please) “Hello world”示例程序现在介绍完毕。我们总算对Hibernate有了一个简单的认识,下面我们将回过头来,对Hibernate的主要API调用作一下简要的介绍: 理解Hibernate的架构 当你想用Hibernate开发自己的基于持久层的应用时,第一件事情应当是熟悉它的编程接口。Hibernate的API接口设计得尽量简洁明了,以方便开发人员。然而实际上由于ORM的复杂性,它的API一般都不可能设计得很简单。但是别担心,你没有必要一下子了解所有的Hibernate的API接口。 我们将应用层放在了持久层的上部,实际上在传统的项目中,应用层充当着持久层的一个客户端角色。但对于一些简单的项目来说,应用层和持久层并没有区分得那么清楚,这也没什么,在这种情况下你可以将应用层和持久层合并成了一层。 Hibernate的接口大致可以分为以下几种类型: · 一些被用户的应用程序调用的,用来完成基本的创建、读取、更新、删除操作以及查询操作的接口。这些接口是Hibernate实现用户程序的商业逻辑的主要接口,它们包括Session、Transaction和Query。 · Hibernate用来读取诸如映射表这类配置文件的接口,典型的代表有Configuration类。 · 回调(Callback)接口。它允许应用程序能对一些事件的发生作出相应的操作,例如Interceptor、Lifecycle和Validatable都是这一类接口。 · 一些可以用来扩展Hibernate的映射机制的接口,例如UserType、CompositeUserType和IdentifierGenerator。这些接口可由用户程序来实现(如果有必要)。 Hibernate使用了J2EE架构中的如下技术:JDBC、JTA、JNDI。其中JDBC是一个支持关系数据库操作的一个基础层;它与JNDI和JTA一起结合,使得Hibernate可以方便地集成到J2EE应用服务器中去。 在这里,我们不会详细地去讨论Hibernate API接口中的所有方法,我们只简要讲一下每个主要接口的功能,如果你想了解得更多的话,你可以在Hibernate的源码包中的net.sf.hibernate子包中去查看这些接口的源代码。下面我们依次讲一下所有的主要接口: 核心接口 以下5个核心接口几乎在任何实际开发中都会用到。通过这些接口,你不仅可以存储和获得持久对象,并且能够进行事务控制。 Session接口 Session接口对于Hibernat