第3章Hibernate中基本的数据库操作实现

  • 格式:pdf
  • 大小:524.29 KB
  • 文档页数:21

1 第3章 Hibernate中基本的数据库操作实现

3.1 概述

Hibernate主要是解决实体-关系映射问题的。这其中实体PO(Persistent Object)的持久化、数据

库事务、对数据库的操作等都是在Session环境下完成的。但是Session不是线程安全的。同一个

Session不能被多个线程使用,否则将会引起存取数据逻辑上的混乱。而SessionFactory是线程安全

的,多个线程可以访问同一个SessionFactory,获取不同的Session从而保证了Hibernate的安全性。

事件接口 SaveOrUpdateEvent等事件类

EntityEntry 说明,在持久化中的作用

Sesion的PersistenceContext

级联操作的处理机制

3.2 Session接口中各种保存方法的用法与底层实现细节

在Hibernate中接口Session有两个子接口。一个是org.hibernate.event.EventSource,

另一个是org.hibernate.classic.Session。后者是为了兼容以前版本的Hibernate的。

Session的实现类org.hibernate.impl.SessionImpl实现了以上两个接口,如代码清单

3-1所示。

图3-1

代码清单3-1 SessionImpl类实现的接口 public final class SessionImpl extends AbstractSessionImpl implements EventSource,

org.hibernate.classic.Session, JDBCContext.Context,

LobCreationContext ;

SessionImpl中的保存方法都是采用事件驱动机制,比如:用saveOrUpdate方法保存一个实体

对象,不是直接的将实体转化为sql,然后保存到数据中,而是发布一个SaveOrUpdateEvent事件。

2 然后由Hibernate中的与之相应的监听器处理,Hibernate为每种事件提供了一个默认的监听器,比

如与SaveOrUpdateEvent事件对应的默认监听器是DefaultSaveOrUpdateEventListener。当你在配置

Hibernate时没有给特定事件指定监听器,将会使用Hibernate提供的默认监听器。你也可以通过配

置Hibernate使用自己定义的监听器,处理指定的事件。除非你有特殊的需求,一般都使用默认的

事件监听器。配置方法详细见第二章。常见的保存方法采用的默认监听器及事件见表3-1

表3-1 常见的保存方法采用的默认监听器及事件一览表 方法 事件 默认监听器 监听器父类

saveOrUpdate SaveOrUpdateEvent DefaultSaveOrUpdateEventListe

ner AbstractSaveEve

ntListener

save SaveOrUpdateEvent DefaultSaveEventListener DefaultSaveOrUpdateE

ventListener

update SaveOrUpdateEvent DefaultUpdateEventListener DefaultSaveOrUpdateEventListener

merge MergeEvent DefaultMergeEventListener AbstractSaveEventListener

persist PersistEvent DefaultPersistEventLis

tener AbstractSaveEventListener

事件类是SessionImpl各方法处理的信息载体。通过事件类,将要操作的数据封装到事件类中,

发布到监听器,由监听器处理后返回到SessionImpl中对应的方法中,最后如果有返回值,比如

SaveOrUpdateEvent有result属性,将返回值返回给调用者。每个事件类中的属性各不相同,它们

都是根据具体事件而定义的。比如SaveOrUpdateEvent类定义如下

private Object object;//保存或要更新的对象。 private Serializable requestedId;//实体对象的Id

private String entityName;//实体名称。实体映射文件中class标签中

entityName指定的值

private Object entity; private EntityEntry entry;//实体,在Hibernate中描述一个对象的状态等信息

private Serializable resultId; //实体持久化后的标识id

在Hibernate中使用EntityEntry封装一个实体,记录实体在Session中的状态及其它信息。

private LockMode lockMode; private Status status;

private Status previousStatus;

private final Serializable id;

private Object[] loadedState;

private Object[] deletedState;

《Hibernate技术内幕——深入解析Hibernate架构设计与实现原理》第1章

3

private boolean existsInDatabase; private Object version;

private transient EntityPersister persister; // for convenience to

save some lookups

private final EntityMode entityMode; private final String entityName;

private transient EntityKey cachedEntityKey; // cached EntityKey

(lazy-initialized)

private boolean isBeingReplicated;

private boolean loadedWithLazyPropertiesUnfetched; //NOTE: this is not updated when properties are fetched lazily!

private final transient Object rowId;

3.2.1 saveOrUpdate方法

3.2.1.1 事件类

3.2.1.2发布事件

saveOrUpdate方法是Hibernate接口Session中的一个重要的方法,用于将实体持久化到数据库

中或更新实体。saveOrUpdate方法兼有save和update方法的功能,这里之所以先分析saveOrUpdate

方法,是因为save和update方法的监听器都是saveOrUpdate方法对应监听器的子类。saveOrUpdate

方法对应的事件类如代码所示。saveOrUpdate在接口Session中有两个重载方法,如代码清单3-2

所示。我们接下来就是根据Hibernate的源代码,从saveOrUpdate方法一步一步看看实体是如何保

存或更新到数据库的。代码中加粗的部分是程序运行的路线。为了简明,省去了部分代码。省略部

分用“„„”代替。

代码清单3-2 接口Session中的saveOrUpdate方法定义

public void saveOrUpdate(Object object) throws HibernateException {

saveOrUpdate(null, object);

}

public void saveOrUpdate(String entityName, Object obj) throws

HibernateException { fireSaveOrUpdate( new SaveOrUpdateEvent(entityName, obj,

this) );

}

4 Session实现类SessionImpl中saveOrUpdate方法定义如代码清单3-3,可以看出saveOrUpdate方法

实现十分简单,只是创建一个SaveOrUpdateEvent事件然后,调用fireSaveOrUpdate方法发出事件。

对于saveOrUpdate、save和update方法,Hibernate发布的事件类型都是SaveOrUpdateEvent。

代码清单3-3 saveOrUpdate方法的实现 public void saveOrUpdate(Object object) throws HibernateException { saveOrUpdate(null, object);

} public void saveOrUpdate(String entityName, Object obj) throws HibernateException { fireSaveOrUpdate( new SaveOrUpdateEvent(entityName, obj, this) ); } private void fireSaveOrUpdate(SaveOrUpdateEvent event) {

…… //获得所有的SaveOrUpdateEventListeners监听器。然后将event发布到各个监听器。

SaveOrUpdateEventListener[] saveOrUpdateEventListener =

listeners.getSaveOrUpdateEventListeners();

for ( int i = 0; i < saveOrUpdateEventListener.length; i++ ) { saveOrUpdateEventListener[i].onSaveOrUpdate(event);

}

}

从代码清单3-3中,我们可以看出在saveOrUpdate一个对象时,fireSaveOrUpdate将

SaveOrUpdateEvent事件发布到所有已注册的并实现SaveOrUpdateEventListener接口的监听器中。

该接口十分简单,只有一个抽象方法onSaveOrUpdate,接收SaveOrUpdateEvent事件,Hibernate

对这个接口给出了几个实现类。在该接口上按F4即可看到该接口的继承关系结构图,如图3-2所

示。从图可以看出它有三个实现类DefaultSaveOrUpdateEventListener、

DefaultSaveEventListener、DefaultUpdateEventListener。其中

DefaultSaveEventListener、DefaultUpdateEventListener是