hibernate 原理(ORM)及接口

来源:互联网 发布:js ip地址正则表达式 编辑:程序博客网 时间:2024/05/24 02:41

ORM(Object/Relation Mapping): 对象/关系映射
ORM 主要解决对象-关系的映射

ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中.















接口可以近似地分为如下几类:

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

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

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

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

 

Configuration

正如其名,Configuration 类负责管理Hibernate 的配置信息。Hibernate 运行时需要一些底层实现的基本信息,其中几个关键属性包括:

Hibernate 运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。

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

2、持久化类与数据表的映射关系(*.hbm.xml 文件)

Hibernate配置有两种方法:

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

    Configuration config = new Configuration();

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

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

三、Configuration 的 configure 方法还支持带参数的访问:

File file = new File(“simpleit.xml”);

Configuration cfg = new Configuration().configure(file);

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

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

SessionFactory sessionFactory = config.buildSessionFactory();

Hibernate4 新增了一个 ServiceRegistry 接口,所有基于 Hibernate 的配置或者服务都必须统一向这个 ServiceRegistry 注册后才能生效
       Hibernate4 中创建 SessionFactory 的步骤


 

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

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

Session session = sessionFactory.openSession();

Session 类的方法:

取得持久化对象的方法: get() load()

持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()

开启事务: beginTransaction().

管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等

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

Transaction trans = session.beginTransaction ();

常用方法:

commit():提交相关联的session实例

rollback():撤销事务操作

wasCommitted():检查事务是否提交

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>标签来把一个属性映射到多个字段的做法。


0 0
原创粉丝点击