`
myclover
  • 浏览: 191646 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Hibernate的接口

阅读更多
接口可以近似地分为如下几类:

由应用调用以完成基本的CRUD和查询操作的接口。这些接口是应用的业务/控制逻辑对Hibernate的主要的依赖点。它们包括Session,Transaction和Query。

由应用的底层代码调用以配置Hibernate的接口,最重要的是Configuration类。

允许应用对Hibernate内部出现的事件进行处理的回调接口,例如Interceptor,Lifecycle和Validatable接口。

允许对Hibernate强大的映射功能进行扩展的接口, 例如UserType ,CompositeUserType和IdentifierGenerator。这些接口由应用的底层代码实现(如果需要的话)。



Configuration

正如其名,Configuration 类负责管理Hibernate 的配置信息。Hibernate 运行时需要

获取一些底层实现的基本信息,其中几个关键属性包括:

1、数据库URL

2、数据库用户

3、数据库用户密码

4、数据库JDBC驱动类

1、 数据库dialect,用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据类型到特定数据库数据类型的映射等。

当然,还有指定Hibernate映射文件的位置。(*.hbm.xml)。


Hibernate配置有两种方法:

一、 属性文件配置。默认文件名是hibernate.properties。调用代码:

    Configuration config = new Configuration();

二、 XML文件配置。默认文件名是hibernate.cfg.xml。

Configuration config = new Configuration().configure();


SessionFactory:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它打算在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂——例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。

会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。它也保存了在一个工作单元中读入的数据并且可能在以后的工作单元中被重用(只有类和集合映射指定了使用这种二级缓存时才会如此)。

SessionFactory sessionFactory = config.buildSessionFactory();



Session(会话):该接口是Hibernate使用最多的接口。Session不是线程安全的,它代表与数据库之间的一次操作。Session通过SessionFactory打开,在所有的工作完成后,需要关闭:它的概念介于Connection和Transaction之间。我们可以简单的认为它是已经装载对象的缓存或集合的一个独立工作单元。我们有时也称Session为持久化管理器,因为它是与持久化有关的操作的接口。

Hibernate会话并不是线程安全的因此应该被设计为每次只能在一个线程中使用。Hibernate会话与Web层的HttpSession没有任何关系。

Session session = sessionFactory.openSession();


Transaction:事务将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。

Transaction trans = session.beginTransaction ();


Query: Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。

Query query = session.createQuery(“from User”);


Lifecycle:Lifecycle接口提供了一些回调方法,可以让持久化对象在save或load之后,或者在delete或update之前进行必要的初始化与清除步骤。

public interface Lifecycle {

        public boolean onSave(Session s) throws CallbackException;   (1)

        public boolean onUpdate(Session s) throws CallbackException; (2)

        public boolean onDelete(Session s) throws CallbackException; (3)

        public void onLoad(Session s, Serializable id);              (4)

}

(1) onSave - 在对象即将被save或者insert的时候回调

(2) onUpdate - 在对象即将被update的时候回调(也就是对象被传递给Session.update()的时候)

(3) onDelete - 在对象即将被delete(删除)的时候回调

(4) onLoad - 在对象刚刚被load(装载)后的时候回调

Validatable: 该接口是合法性检查的回调。如果持久化类需要在保存其持久化状态前进行合法性检查,它可以实现下面的接口:

public interface Validatable {

        public void validate() throws ValidationFailure;

}

如果发现对象违反了某条规则,应该抛出一个ValidationFailure异常。在Validatable实例的validate()方法内部不应该改变它的状态。

和Lifecycle接口的回调方法不同,validate()可能在任何时间被调用。应用程序不应该把validate()调用和商业功能联系起来。

Interceptor: Interceptor接口提供从session到你的应用程序的回调方法,让你的程序可以观察和在持久化对象保存/更改/删除或者装载的时候操作它的属性。一种可能的用途是

用来监视统计信息。比如,下面的Interceptor会自动在一个Auditable创建的时候设置其createTimestamp,并且当它被更改的时候,设置其lastUpdateTimestamp属性。


UserType: 开发者创建属于他们自己的值类型也是很容易的。比如说,你可能希望持久化java.lang.BigInteger类型的属性,持久化成为VARCHAR字段。Hibernate没有内置这样一种类型。自定义类型能够映射一个属性(或集合元素)到不止一个数据库表字段。比如说,你可能有这样的Java属性:getName()/setName(),这是java.lang.String类型的,对应的持久化到三个字段:FIRST_NAME, INITIAL, SURNAME。 要实现一个自定义类型,可以实现net.sf.hibernate.UserType或net.sf.hibernate.CompositeUserType中的任一个,并且使用类型的Java全限定类名来声明属性。请查看net.sf.hibernate.test.DoubleStringType这个例子,看看它是怎么做的。

<property name="twoStrings" type="net.sf.hibernate.test.DoubleStringType">

    <column name="first_string"/>

    <column name="second_string"/>

</property>

注意使用<column>标签来把一个属性映射到多个字段的做法。
[color=blue][/color]
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics