http://sourceforge.net/projects/hibernate/files/hibernate3/ 在应用程序中,用来实现业务问题实体的(如,在电子商务应用程序中的Customer和Order) 类就是持久化类。不能认为所有的持久化类的实例都是持久的状态——一个实例的状态也可能 是瞬时的或脱管的。就如同它的名字暗示的,它的实例会被持久性保存于数据库中。 持久化是将程序数据在持久状态和瞬时状态间转换的机制。 我们必须启动Hibernate,此过程包括创建一个全局的SessoinFactory
,并把它储存在应用程序代码容易访问的地方。SessionFactory
可以创建并打开新的Session
。一个Session
代表一个单线程的单元操作,SessionFactory
则是个线程安全的全局对象,只需要被实例化一次。
你可以看到这个类对属性的存取方法(getter and setter method)使用了标准JavaBean命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的设计,但并不是必须的。Hibernate也可以直接访问这些field,而使用访问方法(accessor method)的好处是提供了重构时的健壮性(robustness)。为了通过反射机制(Reflection)来实例化这个类的对象,我们需要提供一个无参的构造器(no-argument constructor)。
对一特定的event,
id
属性持有唯一的标识符(identifier)的值。如果我们希望使用Hibernate提供的所有特性,那么所有的持久化实体(persistent entity)类(这里也包括一些次要依赖类)都需要一个这样的标识符属性。而事实上,大多数应用程序(特别是web应用程序)都需要通过标识符来区别对象,所以你应该考虑使用标识符属性而不是把它当作一种限制。然而,我们通常不会操作对象的标识(identity),因此它的setter方法的访问级别应该声明private。这样当对象被保存的时候,只有Hibernate可以为它分配标识符值。你可看到Hibernate可以直接访问public,private和protected的访问方法和field。所以选择哪种方式完全取决于你,你可以使你的选择与你的应用程序设计相吻合。所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。构造器(constructor)的访问级别可以是private,然而当生成运行时代理(runtime proxy)的时候则要求使用至少是package 级别的访问控制,这样在没有字节码指令(bytecode instrumentation)的情况下,从持久化类里获取数据会更有效率。
把这个Java源代码文件放到开发目录下的
src
目录里,注意包位置要正确。 现在这个目录看起来应该像这样:
到目前为止,我们告诉了Hibernate怎样把
Events
类的对象持久化到数据库的EVENTS
表里,以及怎样从EVENTS
表加载到Events
类的对象。每个实例对应着数据库表中的一行。现在我们将继续讨论有关唯一标识符属性到数据库表的映射。另外,由于我们不关心怎样处理这个标识符,我们就配置由Hibernate的标识符生成策略来产生代理主键字段。
和
id
元素一样,property
元素的name
属性告诉Hibernate使用哪个getter和setter方法。在此例中,Hibernate会寻找getDate()/setDate()
, 以及getTitle()/setTitle()
。为什么
date
属性的映射含有column
attribute,而title
却没有?当没有设定column
attribute 的时候,Hibernate缺省地使用JavaBean的属性名作为字段名。对于title
,这样工作得很好。然而,date
在多数的数据库里,是一个保留关键字,所以我们最好把它映射成一个不同的名字。另一有趣的事情是
title
属性缺少一个type
attribute。我们在映射文件里声明并使用的类型,却不是我们期望的那样,是Java数据类型,同时也不是SQL数据库的数据类型。这些类型就是所谓的Hibernate 映射类型(mapping types),它们能把Java数据类型转换到SQL数据类型,反之亦然。再次重申,如果在映射文件中没有设置type
属性的话,Hibernate会自己试着去确定正确的转换类型和它的映射类型。在某些情况下这个自动检测机制(在Java 类上使用反射机制)不会产生你所期待或需要的缺省值。date
属性就是个很好的例子,Hibernate无法知道这个属性(java.util.Date
类型的)应该被映射成:SQLdate
,或timestamp
,还是time
字段。在此例中,把这个属性映射成timestamp
转换器,这样我们预留了日期和时间的全部信息。应该把这个映射文件保存为
Event.hbm.xml
,且就在Event
Java类的源文件目录下。映射文件可随意地命名,但hbm.xml
的后缀已成为Hibernate开发者社区的约定。现在目录结构看起来应该像这样:
hibernate下载地址
最新推荐文章于 2021-03-30 00:58:26 发布