
本站地址:http://www.bajiao123.com

Hibernate入门
一个重要的术语:Type
Hibernate的设计者们发明了一个术语:Type,它在整个构架中是一个非常基础、有着强大功能的元素。一个Type对象能将一个Java类型映射到数据库中一个表的字段中去(实际上,它可以映射到表的多个字段中去)。持久类的所有属性都对应一个type。这种设计思想使用Hibernate有着高度的灵活性和扩展性。
Hibernate内置很多type类型,几乎包括所有的Java基本类型,例如Java.util.Currency、Java.util.calendar、byte[]和Java.io.Serializable。
不仅如此,Hibernate还支持用户自定义的type,通过实现接口UserType和接口CompositeUserType,你可以加入自己的type。你可以利用这种特色让你的项目中使用自定义的诸如Address、Name这样的type,这样你就可以获得更大的便利,让你的代码更优雅。自定义type在Hibernate中是一项核心特色,它的设计者鼓励你多多使用它来创建一个灵活、优雅的项目!
策略接口
Hibernate与某些其它开源软件不同的还有一点――高度的可扩展性,这通过它的内置策略机制来实现。当你感觉到Hibernate的某些功能不足,或者有某些缺陷时,你可以开发一个自己的策略来替换它,而你所要做的仅仅只是继承它的某个策略接口,然后实现你的新策略就可以了,以下是它的策略接口:
· 主键的生成 (IdentifierGenerator 接口)
· 本地SQL语言支持 (Dialect 抽象类)
· 缓冲机制 (Cache 和CacheProvider 接口)
· JDBC 连接管理 (ConnectionProvider接口)
· 事务管理 (TransactionFactory, Transaction, 和 TransactionManagerLookup 接口)
· ORM 策略 (ClassPersister 接口)
· 属性访问策略 (PropertyAccessor 接口)
· 代理对象的创建 (ProxyFactory接口)
Hibernate为以上所列的机制分别创建了一个缺省的实现,因此如果你只是要增强它的某个策略的功能的话,只需简单地继承这个类就可以了,没有必要从头开始写代码。
以上就是Hibernate的一些核心接口,但当我们真正开始用它进行开发时,你的脑海里可能总会有一个疑问:我是通过什么方式,并从哪里取得Session的呢?以下我们就解答这个问题。
基础配置
现在回顾一下我们先前的内容:我们写出了一个示例程序,并简要地讲解了Hibernate的一些核心类。但要真正使你的项目运行起来,还有一件事必须要做:配置。Hibernate可以配置成可在任何Java环境中运行,一般说来,它通常被用在2-3层的C/S模式的项目中,并被部署在服务端。在这种项目中,Web浏览器、或Java GUI程序充当者客户端。尽管我们的焦点主要是集中在多层web应用,但实际上在一些基于命令行的应用中也可以使用Hibernate。并且,对Hibernate的配置在不同的环境下都会不同,Hibernate运行在两种环境下:可管理环境和不可管理环境
· 可管理环境――这种环境可管理如下资源:池资源管理,诸如数据库连接池和,还有事务管理、安全定义。一些典型的J2EE服务器(JBoss、Weblogic、WebSphere)已经实现了这些。
· 不可管理环境――只是提供了一些基本的功能,诸如像Jetty或Tomcat这样的servlet容器环境。一个普通的Java桌面应用或命令行程序也可以认为是处于这种环境下。这种环境不能提供自动事务处理、资源管理或安全管理,这些都必须由应用程序自己来定义。
Hibernate的设计者们将这两种环境设计了一个统一的抽象界面,因此对于开发者来说只有一种环境:可管理环境。如果实际项目是建立在诸如Tomcat这类不可管理的环境中时,那Hibernate将会使用它自己的事务处理代码和JDBC连接池,使其变为一个可管理环境。
对于可管理的环境而言,Hibernate会将自己集成在这种环境中。对于开发者而言,你所要做的工作非常简单:只需从一个Configuration类中创建一个SessionFactory类就可以了。
创建一个SessionFactory对象
为了能创建一个SessionFactory对象,你必须在Hibernate初始化时创建一个Configuration类的实例,并将已写好的映射文件交由它处理。这样,Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就没有用了,你可以简单地抛弃它。如下是示例代码:
Configuration cfg = new Configuration();
cfg.addResource("hello/Message.hbm.xml");
cfg.setProperties( System.getProperties() );
SessionFactory sessions = cfg.buildSessionFactory();
在以上代码中,Message.hb.xml这个映射文件的位置比较特殊,它与当前的classpath相关。例如classpath包含当前目录,那在上述代码中的Message.hbm.xml映射文件就可以保存在当前目录下的hello目录中。
作为一种约定,Hibernate的映射文件默认以.htm.xml作为其扩展名。另一个约定是坚持为每一个持久类写一个配置文件,想一想如果你将所有持久类的映射写入一个单独的配置文件中的话,那这个配置文件肯定非常庞大,不易维护。但这里又出现了一个新问题:如果为每个类写一个配置文件的话,这么多的配置文件应该存放在哪里呢?
Hibernate推荐你将每个映射文件保存在与持久类相同的目录下,并且与持久类同名。例如我们第一个示例程序中的Message持久类放在hello目录下,那你必须在这个目录下存放名为Message.hbm.xml的映射文件。这样一个持久类都有自己的一个映射文件,避免了出现像struts项目中的“struts-config.xml地狱”的情况。如果你不遵循这种规定,那你必须手动地用addResource()方法将一个个的映射文件载入;但你如果遵循这种规定,那你可以方便地用addClass()方法同时将持久类和它的映射文件载入,以下是体现这种便利性的示例代码:
SessionFactory sessions = new Configuration()
.addClass(org.hibernate.auction.model.Item.class)
.addClass(org.hibernate.auction.model.Category.class)
.addClass(org.hibernate.auction.model.Bid.class)
.setProperties( System.getProperties() )
.buildSessionFactory();
当然,Hibernate的映射文件还有很多其它的配置选项,比如数据库连接的设定,或是能够改变Hibernate运行时行为的一些设定。所有的设置可能是非常庞杂的,足以让你喘不过气来,但是不必担心,因为Hibernate为绝大多数值都设定了一个合理缺省值,你只需要修改这些配置文件中的极小一部分值。
你可以通过以下几种方式来修改Hibernate的系统配置参数:
· 将一个Java.util.Properties实例作为参数传给Configuration类的setProperties()方法。
· 在Hibernate启动时用Java –Dproperty=value的方式设置值。
· 在classpath可以找到的路径下创建一个名为hibernate.properties的配置文件。
· 在classpath可以找到的路径下创建一个名为hibernate.cfg.xml的文件,并在其<property>标签中定义属性值。
以上就是对Hibernate的一个大致介绍,如果你想知道得更多,那本文还是远远不够的,我将陆续推出更多关于Hibernate的资料。但有一点是毫无疑问的:它的确是一个非常优秀的持久层解决方案!
本站地址:http://www.bajiao123.com

