`

hibernate 使用的设计模式(一) 观察者

阅读更多

  以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 entityName
			event.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 appropriate
				if ( 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;
		}
	}

 

   如代码所示:当执行get()方法时,首先创建一个loadEvent,然后触发加载操作,获取对应listeners做出对应的响应;

   SessionImpl为被观察者, listers为观察者, event为事件, event中包含了事件相关的属性。

ps:图1中为SessionImpl中的代码(SessionImpl为session的实现类), 图2为DefaultLoadEventListener的代码(DefaultLoadEventListener为LoadEventListener的实现类)

分享到:
评论

相关推荐

    Hibernate+struts2+观察者+工厂模式实例项目

    本项目"Hibernate+Struts2+观察者+工厂模式实例项目"就是一个典型的Java Web开发案例,它巧妙地结合了ORM框架Hibernate、MVC框架Struts2以及设计模式中的观察者模式和工厂模式,旨在提供一种高效、易于扩展的解决...

    设计模式,hibernate电子书

    "java设计模式 中文"这本书可能涵盖了多种经典的设计模式,如单例模式(Singleton)、工厂模式(Factory)、观察者模式(Observer)、装饰器模式(Decorator)和代理模式(Proxy)等。这些模式可以帮助开发者更好地...

    设计模式相关资料

    此外,很多知名框架和库,如Spring、Hibernate等,都大量运用了设计模式,学习设计模式有助于更好地理解和使用这些工具。 6. **设计模式的优缺点**:设计模式虽然带来了诸多好处,但并非万能解药。过度使用或不恰当...

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

    深入浅出设计模式(中文版)

    行为型设计模式则关注对象间的交互和责任分配,如观察者模式、策略模式、模板方法模式、命令模式、迭代器模式、职责链模式、备忘录模式、状态模式、访问者模式和解释器模式,这些模式能够使代码更加模块化,提高代码...

    WEB开发常用API,包括EXT、HIBERNATE、JDK、SPRING、JQUERY,还有一份设计模式帮助文档

    这份文档可以帮助开发者理解和运用如工厂模式、单例模式、观察者模式等经典设计模式,提升代码的可读性和可维护性。 这些API文档和设计模式指南构成了一个全面的WEB开发参考资料库,无论你是初学者还是经验丰富的...

    JAVA版-设计模式解析(第二版)综合项目实战pdf文档+视频教程

    设计模式是软件工程中的一种最佳实践,它提供了一种在特定场景下解决常见问题的模板。在Java开发中,理解并应用设计模式是提升代码质量和可维护性的重要途径。本资源包“JAVA版-设计模式解析(第二版)综合项目实战pdf...

    Hibernate tool 源代码

    在源代码中,我们还会发现一些关键的API和设计模式,比如工厂模式用于创建不同类型的生成器,观察者模式用于监听并响应数据库结构的变化,以及责任链模式在处理代码生成流程中的应用。这些设计模式的运用使得代码...

    我的设计模式学习

    同时,阅读优秀的开源项目源码,如Spring、Hibernate等,是理解设计模式在实际场景中应用的好途径。 总结来说,设计模式是提升软件质量的重要手段,它们提供了一套通用的解决方案模板。通过学习和实践,我们可以更...

    Java23种设计模式

    在 Java EE 中,也有很多设计模式的应用,例如在 Hibernate 中使用了代理模式和装饰模式。 设计模式是一种解决软件设计问题的方法,可以帮助开发者更好地设计和实现软件系统。在 Java 中,设计模式的应用非常广泛,...

    hibernate3.6源码

    12. **设计模式**: Hibernate源码中大量使用了设计模式,如工厂模式、单例模式、代理模式、观察者模式等,学习源码有助于深化对设计模式的理解。 通过深入分析Hibernate 3.6的源码,我们可以更深入地了解ORM的工作...

    设计模式.rar

    8. **设计模式与框架**:许多成熟的企业级框架,如Spring、Hibernate和.NET Framework,都大量使用了设计模式。了解设计模式有助于我们理解和使用这些框架,同时也可以提高自定义框架或库的能力。 9. **学习和实践*...

    java设计模式的分析及其应用

    - 观察者模式(Observer):定义对象间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。 - 状态模式(State):允许对象在其内部状态改变时改变其行为。 - 策略模式...

    hibernate_3.1源码

    7. **设计模式**:在源码中识别并学习使用的设计模式,如工厂模式、代理模式、单例模式等,这些都是软件设计的基础。 8. **元数据获取**:研究Hibernate如何从XML或注解中获取类和属性的元数据,以便进行对象关系...

    设计模式答辩题

    设计模式是软件开发中的一种最佳实践,它是在特定情境下解决问题的经验总结,目的是为了提高代码的可重用性、可维护性和可扩展性。在Java的SSH三大框架中,Struts、Hibernate和Spring都广泛地应用了设计模式。 首先...

    java与设计模式

    学习和理解设计模式不仅有助于写出高质量的Java代码,还能帮助开发者更好地理解和利用已有的开源框架和库,因为许多知名框架(如Spring、Hibernate)都大量应用了设计模式。在实际工作中,结合Java的特性(如多态、...

    hibernate+ehcache代码示例

    在Java开发中,常见的设计模式如单例模式、工厂模式、观察者模式、装饰器模式等都有其实际应用。这些模式可以帮助我们写出可维护、可扩展的代码。 在`HibernateDemo1.zip`中,你可能会看到如何集成Ehcache到...

    java-javaee-软件工程-设计模式

    本篇文章将深入探讨“java-javaee-软件工程-设计模式”这一主题,并结合SSH2(Struts、Spring、Hibernate)框架,解析相关知识点。 首先,Java和JavaEE是两种广泛应用于企业级应用开发的技术栈。Java是一种面向对象...

    软件工程设计模式基础.docx

    行为型模式如观察者模式,它定义了对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新;策略模式则允许在运行时选择算法或策略。 在实际开发中,MVC(Model-View-...

Global site tag (gtag.js) - Google Analytics