hibernate 使用的设计模式(一) 观察者(50校招生网)
来源:互联网 发布:三维施工平面设计软件 编辑:程序博客网 时间:2024/05/01 19:59
hibernate 使用的设计模式(一) 观察者(50校招生网)
以hibernate.get(String, Serializable)方法为例:
get()的方法实现为:
图1:
public Object get(String entityName, Serializable id, LockMode lockMode) throws HibernateException {LoadEvent event = new LoadEvent(id, entityName, lockMode, this); fireLoad(event, LoadEventListener.GET);return event.getResult();}private void fireLoad(LoadEvent event, LoadType loadType) {errorIfClosed();checkTransactionSynchStatus();LoadEventListener[] loadEventListener = listeners.getLoadEventListeners();for ( int i = 0; i < loadEventListener.length; i++ ) {loadEventListener[i].onLoad(event, loadType);}}
图2:
public void onLoad(LoadEvent event, LoadEventListener.LoadType loadType) throws HibernateException {final SessionImplementor source = event.getSession();EntityPersister persister;if ( event.getInstanceToLoad() != null ) {persister = source.getEntityPersister( null, event.getInstanceToLoad() ); //the load() which takes an entity does not pass an entityNameevent.setEntityClassName( event.getInstanceToLoad().getClass().getName() );}else {persister = source.getFactory().getEntityPersister( event.getEntityClassName() );}if ( persister == null ) {throw new HibernateException("Unable to locate persister: " +event.getEntityClassName());}if ( persister.getIdentifierType().isComponentType() && EntityMode.DOM4J == event.getSession().getEntityMode() ) {// skip this check for composite-ids relating to dom4j entity-mode;// alternatively, we could add a check to make sure the incoming id value is// an instance of Element...}else {Class idClass = persister.getIdentifierType().getReturnedClass();if ( idClass != null && ! idClass.isInstance( event.getEntityId() ) ) {throw new TypeMismatchException("Provided id of the wrong type for class " + persister.getEntityName() + ". Expected: " + idClass + ", got " + event.getEntityId().getClass());}}EntityKey keyToLoad = new EntityKey( event.getEntityId(), persister, source.getEntityMode() );try {if ( loadType.isNakedEntityReturned() ) {//do not return a proxy!//(this option indicates we are initializing a proxy)event.setResult( load(event, persister, keyToLoad, loadType) );}else {//return a proxy if appropriateif ( event.getLockMode() == LockMode.NONE ) {event.setResult( proxyOrLoad(event, persister, keyToLoad, loadType) );}else {event.setResult( lockAndLoad(event, persister, keyToLoad, loadType, source) );}}}catch(HibernateException e) {log.info("Error performing load command", e);throw e;}}
50校招生网 http://www.50xiao.com
如代码所示:当执行get()方法时,首先创建一个loadEvent,然后触发加载操作,获取对应listeners做出对应的响应;
SessionImpl为被观察者, listers为观察者, event为事件, event中包含了事件相关的属性。
ps:图1中为SessionImpl中的代码(SessionImpl为session的实现类), 图2为DefaultLoadEventListener的代码(DefaultLoadEventListener为LoadEventListener的实现类)
0 0
- hibernate 使用的设计模式(一) 观察者(50校招生网)
- struts+spring+hibernate分别用到了什么设计模式(50校招生网)
- 设计模式(一)观察者设计模式
- 设计模式-观察者模式(一)
- 设计模式之观察者模式(一)
- 设计模式学习(一)观察者模式
- 设计模式之观察者模式(一)
- 观察者设计模式(Observable 类Observer接口的使用)
- 观察者设计模式(C#委托和事件的使用)
- 观察者模式(一)
- 观察者模式(一)
- 观察者模式(一)
- 观察者模式(一)
- Unity3D设计模式之观察者模式(16)(一)
- AspectJ实现设计模式(一)——观察者模式
- 设计模式之观察者模式(Observer Pattern)(一)
- Observer观察者模式(来自《设计模式》一书)
- 设计模式一日一练:观察者模式(Observer)
- android 串口通讯2-对JNI封装JAVA的类,方便别人的调用
- Redhat 5.4 Oracle 10g RAC 删除节点
- Android开发把项目打包成apk
- object-c小结
- 帐套和会计科目的理解
- hibernate 使用的设计模式(一) 观察者(50校招生网)
- 【转载】OpenCV配置 VS2010 VS2012 Win7 Win8
- 利用工具自动生成makefile文件
- Linux下Fork与Exec使用
- hdu3374String Problem(kmp+最小表示+next数组理解)
- Javascript对cookie进行增、删、查
- QT 仓库管理系统 预览版
- 静态编译fbv --测试LCD
- [已解决]百度地图混淆代码后崩溃问题 (博客以己用)